该方法在方法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 );
}
2条答案
按热度按时间ubbxdtey1#
如果我没猜错的话,您有一个如下所示的SQL查询:
该方法在方法
doProcess()
中执行,在多个线程中运行。根据我对RDBMS的了解(这并不多),
SELECT
并不锁定它读取的记录,这意味着doProcess()
的所有示例都将获得相同的记录集并处理它们-结果是每个记录都被处理多次。要摆脱这种情况,请考虑以下结构(THIS IS NOT JAVA CODE!):
要在 * 真实的 * Java中实现它,请查看
java.sql.ResultSet
、Executors
等。您还需要创建一个MyRecord
类型,它是从ResultSet
初始化的。基本上,只有一个线程从数据库中阅读数据(除此之外什么也不做!),然后它从线程池中提取另一个线程来处理单个记录并触发它。
jogvjijk2#
您可以从一个线程读取行,但将从ResultSet读取得每一行传递给工作线程池,以加快处理速度.
每一行只处理一次,您可以配置池以获得最大吞吐量。