0

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

我可以:

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

  2. 使用多线程:更多线程将同时执行相同的工作,添加或更新更多行。

谢谢。

4

3 回答 3

1

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

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

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

于 2013-09-30T20:55:20.183 回答
0

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

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

我敢打赌,我认为多线程不会加快它的速度,因为它会降低写入性能,因为有多个事务。

但只有一个有效的答案: 测量它

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

于 2013-09-30T21:10:36.157 回答
0

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

  1. 使用多线程无法读取文件(如果你这样做也不会有任何不同的性能)。

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

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

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

我使用的另一种方法是 Spring batch,它从文件中读取数据块准备语句并进行批量加载。编码一样简单。性能上有区别。

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

于 2013-09-30T21:59:45.737 回答