如何解决多线程查询 Oracle / java 7
我在尝试使用多线程查询大表时遇到性能问题。 我使用的是 Oracle、Spring 2 和 java 7。
我使用连接数与线程数一样多的 PoolDataSource(驱动程序 oracle.jdbc.pool.OracleDataSource)来分析单个表。
我通过记录 poolDataSource.getStatistics()
确保我有足够的可用连接。
代码如下:
ExecutorService executorService = Executors.newFixedThreadPool(nbThreads);
List<Foo> foo = new ArrayList<>();
List<Callable<List<Foo>>> callables = new ArrayList<>();
int offset = 1;
while(offSetMaxReached) {
callables.add(new Callable<List<Foo>> {
@Override
public List<Foo> call() throws SQLException,InterruptedException {
return dao.doTheJob(...);
}
});
offset += 10000;
}
for(Future<List<Foo>> fooFuture : executorService.invokeAll(callables)) {
geometrieIncorrectes.addAll(fooFuture.get());
}
executorService.shutdown();
executorService.awaitTermination(1,TimeUnit.DAYS);
在 dao 中,我使用了来自 PoolDataSource 和 Spring JdbcTemplate.query(query,PreparedStatementSetter,RowCallBackHandler) 的连接。
doTheJob
方法对每个查询结果执行完全相同的操作。
我的查询看起来像:SELECT A,B,C FROM MY.BIGTABLE OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
所以,总而言之,我有 n 个线程被 FixThreadPool 调用,每个线程处理完全相同的数据量并做完全相同的事情。 但是每个线程完成时间都比上一个长!
示例: 4 个线程同时启动,但每个 resultSet 的第一行(即在 RowCallBackHandlers 中)在 :
- 线程 1:1.5 秒
- 线程 2:9 秒
- 线程 3:18 秒
- 线程 4:35 秒
等等...
这种行为的原因是什么?
编辑:
问题的主要原因在于已处理的表本身。
使用 OFFSET x ROWS FETCH NEXT y ROWS ONLY
,Oracle 需要遍历所有行,从一行开始。
因此访问偏移量 10 比访问偏移量 10000000 更快!
我能够通过临时表和良好的索引获得良好的响应时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。