我使用单个连接使用Java在Oracle数据库上执行查询。使用多个线程而不是从一个结果集中读取一个线程会更快吗?
考虑我自己将实现读操作的线程安全性。
简单地说,我想知道,单个结果集在多个线程的单个连接上是否有任何性能提升?
答案 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
。其他环境可能有类似的东西。