【发布时间】:2013-11-23 18:09:12
【问题描述】:
在我们的 Java 应用程序中,我需要从 oracle 数据库中读取大约 8000 万条记录。我正在尝试为此重新设计多线程程序。目前我们正在使用 Java 5 线程池,其中 10 个线程基于主键模式并行读取数据库。每个线程将读取不同的模式,例如 001* 和 002*。
如何提高该程序的性能?我正在考虑设计模式,让线程读取数据库并将处理委托给子线程。在我们现有的设计中,不同的线程通过 10 个 jdbc 连接来访问表。使用新方法,我将只有一个线程读取表格。
我们对每个线程都有不同的选择语句,例如 select count(*) from "+table+ " where id like '"+format + "%'"。
好吧,读 rowid 模式听起来不错,但是通过 rowid 或 rownum 来读好吗?
任何机构都可以请教新方法的优缺点吗?还有其他方法可以实现吗?
【问题讨论】:
-
在不知道瓶颈的来源的情况下,重新设计它可能会使问题变得更糟,也可能变得更好。我建议您花更多时间来确定为什么下载数据需要这么长时间,并设计您的软件来解决这个问题。
-
你可能不会从线程中获得很大的性能提升,因为数据库操作可能会受到 IO 限制。我将从完全删除线程开始。
-
确实 - 如果您将数据库存储在单个物理硬盘驱动器上,多线程读取可能只会使问题变得更糟,因为它可能会导致更多的磁盘寻道。
-
除非你相当确定它是均匀分布的,否则不要按“模式”分割。最好在 rowid 上按块拆分,以便您挑选出在磁盘上靠得很近的信息,并且通常会非常均匀地拆分大卷。你是分块还是只运行 10 个线程,每个线程都有一个选择?
-
感谢 cmets,我已经修改了问题的更多细节。
标签: java multithreading oracle jdbc