java - 在任何数据库上处理大量事务的方法?

标签 java design-patterns architecture hardware

我有一个数据转换产品,它允许选择数据库中的表并将源数据库中的行数据转换为目标数据库。

这是在当前产品(基于 Java 的工作台和引擎)中通过一次处理 1000 行并并行执行 10 个线程来处理的。这种方法适用于较小的数据集。但是,当我必须一次转换巨大的数据集(比如大约 X 百万条记录)时 - 这种方法仍然有效,但是

  • 运行我的产品的主机 CPU 负载过重。
  • 源数据库和目标数据库处理过多的事务,速度开始变慢。 (现在,这可能是因为数据库服务器可能在较慢的硬件上运行。)

我开始寻找解决方案,我很快通过请求在源/目标数据库服务器机器上“加强”硬件来解决这个问题。例如,这涉及购买一个新的多核 CPU 和一些额外的 RAM。事实证明,升级硬件不仅仅是唯一的问题:需要为数据库采购多个软件许可证 - 多亏了多核处理器(每个核心许可证)。

所以,现在球在我手上,我将不得不想办法解决这个问题,方法是对我的产品进行更改。而且,这就是我需要你帮助的地方。此时此刻,我想到了一种可能的处理巨大负载的方法:

方法 1

  1. 从源数据库读取数据,将其保存到临时介质(文件)。
  2. 通过在分布式环境(更便宜的单核机器)中运行它来转换持久文件中的数据,然后处理切换到文件持久性的“权衡移动”。 (使用类似 Apache Hadoop 的东西来处理分布式计算部分)
  3. 将数据写入目标数据库。

从架构的角度来看,这就是我目前所能想到的全部内容。 你以前处理过这种情况吗?如果是,你是如何处理的? 感谢您的建议和帮助。

最佳答案

在不增加数据库许可成本的情况下,您可以做几件事:

  • 您的工具使 CPU 负载过重,假设您的工具在未运行数据库的机器上运行,请增加该机器的 CPU 能力,或者如果您的工具允许它在多台机器上运行。
  • 活跃交易数量上升的原因之一是每笔交易都需要时间才能完成。您可以通过优化磁盘或放入更快的磁盘来加快速度。

此外,如果您使用插入而不是批量插入,则存在巨大的改进潜力。普通插入的问题在于它会将信息写入日志,以便可以回滚事务。

this 案例中,我能够帮助某人将加载时间从 10 小时 减少到 6 分钟 :)

关于java - 在任何数据库上处理大量事务的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701632/

相关文章:

java - equals() 中的 getClass() 为我的实体提供了意外的结果

java - 换行继续字符串的一部分

design-patterns - 静态工厂方法与实例(普通)构造函数?

architecture - 系统设计面试题

Java:通过从另一个线程以某种方式发出信号来从主线程调用方法

java - 尽管使用了 validate(),GUI 仍不更新

java - 开发屏幕管理器的设计模式

c# - 使用 SQLite 时实现 MVVM 设计模式的正确方法

ruby-on-rails - 数据何时应包含在 Rails 自己的模型中?

android - 将 1000 多条记录上传到服务器的最佳方法是什么,该服务器还包含来自 iOS/Android 应用程序的每条记录的图像?