Oracle和Java:如何避免两个不同的线程从包含百万条记录的表中读取相同的行

jdzmm42g  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(169)

如何避免两个不同的java线程从包含百万条记录的表中读取相同的行。
我必须处理数百万条记录,并且查询中不会有任何where子句(因为需要处理所有可用记录)
我该怎么做呢?没有使用任何java框架

ubbxdtey

ubbxdtey1#

如果我没猜错的话,您有一个如下所示的SQL查询:

SELECT * FROM mytable

该方法在方法doProcess()中执行,在多个线程中运行。
根据我对RDBMS的了解(这并不多),SELECT并不锁定它读取的记录,这意味着doProcess()的所有示例都将获得相同的记录集并处理它们-结果是每个记录都被处理多次。
要摆脱这种情况,请考虑以下结构(THIS IS NOT JAVA CODE!):

class Processor implements Runnable
{
  private final MyRecord m_Record;
  public Processor( final MyRecord record ) { m_Record = record; }
  final void run() { doProcess(); }
}

…
var resultSet = executeQuery( "SELECT * FROM myTable" );
while( resultSet.hasMoreEntries() )
{
    var record = resultSet.getEntry();
    var processor = new Processor( record );
    threadPool.execute( processor );
}

要在 * 真实的 * Java中实现它,请查看java.sql.ResultSetExecutors等。您还需要创建一个MyRecord类型,它是从ResultSet初始化的。
基本上,只有一个线程从数据库中阅读数据(除此之外什么也不做!),然后它从线程池中提取另一个线程来处理单个记录并触发它。

jogvjijk

jogvjijk2#

您可以从一个线程读取行,但将从ResultSet读取得每一行传递给工作线程池,以加快处理速度.
每一行只处理一次,您可以配置池以获得最大吞吐量。

相关问题