Java 在任何数据库上处理大型事务的方法?
我有一个数据转换产品,它允许选择数据库中的表,并将源数据库中的行数据转换为目标数据库 在当前产品(基于java的工作台和引擎)中,可以通过一次处理1000行并并行处理10个线程来处理这一问题。这种方法适用于较小的数据集。但是,当我必须一次性转换巨大的数据集(比如说大约X百万条记录)时,这种方法仍然有效,但是Java 在任何数据库上处理大型事务的方法?,java,design-patterns,architecture,hardware,Java,Design Patterns,Architecture,Hardware,我有一个数据转换产品,它允许选择数据库中的表,并将源数据库中的行数据转换为目标数据库 在当前产品(基于java的工作台和引擎)中,可以通过一次处理1000行并并行处理10个线程来处理这一问题。这种方法适用于较小的数据集。但是,当我必须一次性转换巨大的数据集(比如说大约X百万条记录)时,这种方法仍然有效,但是 我的产品运行的主机CPU负载很重 源数据库和目标数据库中的事务太多,导致它们开始减速。(现在,这可能是因为数据库服务器可能运行在较慢的硬件上。) 我开始寻找解决方案,并通过请求源/目标数
- 我的产品运行的主机CPU负载很重
- 源数据库和目标数据库中的事务太多,导致它们开始减速。(现在,这可能是因为数据库服务器可能运行在较慢的硬件上。)
感谢您的建议和帮助 这里要考虑的第一件事是您是否真的需要为这么多的数据进行事务处理。如果答案是否定的,那么您的数据库产品可能有一个批量插入选项,它是为这种大型数据库插入而设计的 编辑(进一步评论):我认为最划算的做法(无论如何,在SQL Server中)是在操作期间将目标数据库设置为简单恢复模式。事实上,如果您这样做了,那么很可能不需要进行任何其他代码更改
但是,只有当目标数据库没有同时用于其他事情时,这才合适。我认为这是一项基本要求。当OLAP事务处于活动状态时,试图将2500万条记录插入数据库是一个基本的数据库错误。如果这是绝对必要的,那么我认为解决方案是使流程非常缓慢(有明显的停顿),以便释放资源,使数据库能够继续运行。您是否使用较小规模的事务对其进行了基准测试?否则我就不会使用事务来处理这个问题。从您的许可问题来看,您似乎正在使用oracle或sql server。它们都具有大容量插入功能,这比事务更适合此功能。在不增加数据库许可证成本的情况下,您可以做以下几件事:
- 您的工具将CPU置于繁重的负载下,假设您的工具在未运行数据库的机器上运行,请增加该机器上的CPU电源,或者如果您的工具允许它在多台机器上运行
- 活动事务数量增加的原因之一是每个事务都需要时间来完成。您可以通过优化磁盘或安装更快的磁盘来加快速度
- 将源数据复制到“镜像”中李>
- 在“镜像”上执行ETL
最后一件事-您可以尝试使用ETL工具-如果您正在运行,请使用oracle sql loader(导入/导出)。导入中间表中的数据,一切正常后,在将主表重命名为备份后,将该表重命名为主表。请记住,您应该仅在每次导入/上载后应用约束。您可以从java程序调用sql loader。性能瓶颈是什么?您已经提到了两个候选者:应用程序CPU负载和数据库