多线程任务与否?

时间:2013-09-30 20:51:19

标签: java database multithreading

我不知道是否值得使用多线程来完成以下任务。它读取输入文件,对于每一行,它读取数据库中的表并检查记录是否存在(具有相同的id),然后添加或更新该表中的记录。

我可以:

  1. 使用单个线程,逐行读取和写入数据库

  2. 使用多线程:更多线程会同时添加或更新更多行。

  3. 感谢。

3 个答案:

答案 0 :(得分:1)

  

我正在开发一个java任务,但我不知道是否值得使用多线程。

答案很大程度上取决于数据库系统的性能。如果它有多余的IO带宽,那么多线程可能有所帮助。但机会是IO绑定。即使您为问题添加了多个线程,它们也可能只是在等待数据库IO带宽而不执行很多并发执行。您可能花费编程时间进行转换,只看到边际速度(如果有的话)速度提升。

通过将数据库移动到SSD驱动器而不是花时间线程查找,您可能会获得更多性能提升。

答案 1 :(得分:0)

根据我的经验,使用多个线程读取文件的速度并不比在一个线程中读取文件快。我不希望它更快。

如果使用PreparedStatements和批量更新,写入数据库的速度会更快。

我不认为多线程会加快速度,我敢打赌,由于多次交易,它会降低写入性能。

但只有一个有效的答案: 衡量

如果您没有性能问题,请不要尝试修复。这将导致更糟糕的代码。

答案 2 :(得分:0)

为什么不选择Springs批量更新(如果你可以使用spring)它非常简单,并且有很多缩放选项。我有类似的要求。我曾经使用过两种不同的方法  第一个。   逐行读取文件并将其保存在列表中,直到达到某个限制为10000,一旦达到限制,创建一个线程并传递列表。用于验证数据和写入文件(单个线程用于写入文件).once所有操作我用来调用sql loader。

  1. 使用多线程无法完成读取文件(如果可以的话) 也不会有任何差异表现。)

  2. 如果之前有大量验证,则多线程ID非常有用 写信给DB。

  3. 您的连接池应始终大于线程数

  4. 虽然SQL加载器给了我显着的性能,但是数据块的写入量将给予性能,否则产生线程所消耗的时间将超过业务逻辑的实际执行

  5. 我使用的另一种方法是Spring批处理 从文件读取大量数据准备语句并进行批量加载。编码简单。性能有所不同。

    为什么你不能从db中读取所有数据(是的,它的内存消耗)并在准备语句时验证你的数据(并决定插入/更新)而不是有多个db调用