我有一个数据转换产品,它允许在数据库中选择一个表并将源数据库中的行数据转换为目标数据库.
这是在当前产品(基于java的工作台和引擎)中处理的,一次处理1000行并且并行执行10个线程.这种方法适用于较小的数据集.但是,当我必须同时转换大量数据集(比如大约X万条记录)时 – 这种方法仍然有效,但是
>我的产品运行的主机的cpu负载很重.
>源数据库和目标数据库被打得太多,他们开始放慢速度. (现在,这可能是因为数据库服务器可能在较慢的硬件上运行.)
我开始寻找解决方案,并通过在源/目标数据库服务器计算机上请求硬件“加强”来快速解决这个问题.这涉及到购买新的多核cpu和一些额外的RAM.事实证明,升级硬件不仅仅是唯一的问题:需要购买数据库的多个软件许可证 – 多亏了多核处理器(每个核心许可证).
所以,球现在在我的球场上,我将不得不通过改变我的产品来找到解决这个问题的方法.而且,这是我需要你帮助的地方.此时,我可以想到一种处理大负载的可能方法:
Approach1
>从源数据库读取数据,将其持久保存到临时介质(文件).
>通过在分布式环境(更便宜的单核机器)中运行数据来转换持久文件中的数据,通过处理切换到文件持久性的“权衡移动”. (使用Apache Hadoop之类的东西来处理分布式计算部分)
>将数据写入目标数据库.
从架构的角度来看,这就是我现在能想到的.
你以前处理过这种情况吗?如果是的话,你是怎么处理的?
感谢您的建议和帮助.@H_301_21@
>假设您的工具在未运行数据库的计算机上运行,增加了该计算机的cpu功耗,或者您的工具允许它在多台计算机上运行,那么您的工具正在使cpu负载过重.
>活动事务数量增加的原因之一是每个单独的事务需要一些时间才能完成.您可以通过优化磁盘或放入更快的磁盘来加快速度.
此外,如果您使用插入而不是批量插入,则存在巨大的改进潜力.普通插入的问题是它将信息写入日志,以便可以回滚事务.
在this案例中,我能够帮助某人将加载时间从10小时减少到6分钟:)@H_301_21@ 原文链接:https://www.f2er.com/java/437719.html