【问题标题】:Processing hundreds of thousands of records using Hibernate and Threading, swiftly使用 Hibernate 和 Threading 快速处理数十万条记录
【发布时间】:2016-06-26 13:31:20
【问题描述】:

我有一个严重的问题。我正在编写一个应该在一小时内处理超过 500,000 条记录的代码。通常,这些记录中的每一个都有另一个表中的数据,我必须在处理时去查找。

我目前正在使用休眠。我尝试使用具有多个线程的 Executor 服务,每个线程处理 100 条记录 - 也就是说,有 10 个线程,每个线程处理 100 条记录,当一个线程完成时,它会离开池并进入另一个线程。

但问题是,速度并没有提高。我注意到,我运行的线程越多,整个过程就越慢。目前,一个线程处理 100 条记录需要 2 分钟。当我运行 10 个线程时,需要 20 分钟,这与在 1 个线程中运行 1000 条记录基本相同!

我认为这些线程应该同时运行。我可以使用不同的实现方式吗?

请注意,我使用的是具有 8 个内核和 64GIG RAM 的服务器。

谢谢

【问题讨论】:

  • 所以你的瓶颈可能在其他地方。想想磁盘/网络 IO、数据库锁(事务管理)、Java 代码中的信号量(同步块等)。我将从详细分析开始...
  • “我认为这些线程应该同时运行” - 是什么让您认为它们不是?
  • 因为,当我运行一个线程时,大约需要 2 分钟才能完成 100 条记录的处理。当我运行 10 个线程,其中 1 个处理 100 条记录时,大约需要 20 分钟。这听起来不像是我的并发
  • 一些日志语句应该很容易清除它——运行方法启动时的日志语句和结束时的日志语句。如果消息是交错的,那么你有并发执行,如果没有,那么你没有。使用具有多个线程的 Executor 并不能保证更快的执行,它可以保证并发执行。您很可能遇到了数据库锁定问题(正如“home”所建议的那样),并且使用多线程加剧了这个问题,而不是改善它。
  • 你用过JVisualVM这样的工具吗?它可以告诉您哪些方法占用了大部分运行时间,并让您了解瓶颈在哪里。它与 JDK 捆绑在一起。 TBH,如果您的代码正在尝试处理大型数据集并且使用多个线程时性能下降,那么这表明您有 (i) 糟糕的 SQL,(ii) 考虑不周的事务或其他问题。

标签: java multithreading hibernate


【解决方案1】:

如果我是你,我会在 Jprofiler 等配置文件下运行该应用程序,然后查看处理卡住的位置。你会在 30 分钟内知道问题所在。

【讨论】:

    【解决方案2】:

    我通过以最轻量形式查询休眠实体解决了这个问题。我不是用所有变量查询整个对象的列表,而是用它们的 id 查询整个对象的列表,将它们发送到线程,然后根据我需要的特定列查询每个对象。

    这加快了进程。我的大多数表都有很多列,其中大部分在我的处理中不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2016-01-29
      相关资源
      最近更新 更多