2013-09-30 155 views
0

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

我可以:

  1. 使用单个螺纹,其读出,并通过线

  2. 写入数据库顺序,线路上使用多线程:多个线程会完成同样的工作在添加或更新更多条线与此同时。

谢谢。

+1

确保你没有为每个操作建立新的数据库连接! – pamphlet

+0

如果你不知道它是否值得多线程,你显然不需要做多线程。一旦你肯定知道(即你遇到性能问题),那就去做吧。 – AJMansfield

回答

0

根据我的经验,阅读多个线程的文件并不比在一个线程中读取文件快。我不会指望它会更快。

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

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

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

如果你没有一个性能问题,不要试图修复一个。这将导致更糟糕的代码。

1

我正在开发一个Java的任务,但我不知道这是否是使用多线程的价值。

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

通过将数据库移动到SSD驱动器,您可能会花费更多的时间对查询进行线程化,从而提高性能。

0

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

  1. 读书不能使用多线程(如果你 也不会有任何区别性能)来完成的文件。

  2. 多线程标识符有用,如果您在写入数据库之前有大量验证之前 。

  3. 您连接池应该比线程

    数始终大于
  4. 虽然SQL装载机给我意义的性能,数据块的写ammount的会给消耗产卵线程将更多的则表现其他时间业务逻辑

我用另一种方法的实际执行是春季批次 从文件准备的发言,并做了批量加载读取数据块。编码简单。性能有差异。

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