考虑性能增益,读取具有多个线程的单个数据库结果集是明智的

时间:2013-10-03 18:29:04

标签: database multithreading performance oracle

我使用单个连接使用Java在Oracle数据库上执行查询。使用多个线程而不是从一个结果集中读取一个线程会更快吗?

考虑我自己将实现读操作的线程安全性。

简单地说,我想知道,单个结果集在多个线程的单个连接上是否有任何性能提升?

1 个答案:

答案 0 :(得分:2)

  

通过多个线程的单个连接从单个结果集读取任何性能增益吗?

如果所有这些线程正在读取,那么没有。多线程甚至可以使它变慢,因为你必须进行某种同步以防止并发读取。所以你的多线程最终会按顺序执行。您甚至可能发现除了创建它之外的任何线程都无法访问单个连接。

现在,如果你想从一个数据库中读取并写入另一个数据库,那么最好使用某种生产者 - 消费者关系。生产者从数据库中读取数据并将数据放入队列中。消费者线程从队列中读取并写入另一个数据库。

所以制作人这样做:

while not end of data
    read record
    put record on input queue
end-while
mark end of queue

消费者:

while not end of queue
    remove item from input queue
    write record to database
end-while

使用该配置,您可以获得非常大的性能提升,因为线程彼此独立运行,但共享队列除外,该队列通常是以这种方式针对并发访问进行优化的数据结构。例如,.NET具有BlockingCollection。其他环境可能有类似的东西。