我在尝试查询具有多个线程的大型表时遇到性能问题。我使用的是oracle、Spring2和Java7。
我使用一个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的连接和SpringJDBCTemplate.query(query、preparedstatementsetter、rowcallbackhandler)。这个 doTheJob
方法对每个查询结果执行完全相同的操作。
我的查询如下所示: SELECT A, B, C FROM MY.BIGTABLE OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
总之,我有n个线程被fixthreadpool调用,每个线程处理完全相同的数据量,做完全相同的事情。但是每个线程的完成时间都比最后一个长!
示例:4个线程同时启动,但每个结果集的第一行(即rowcallbackhandlers中的第一行)在以下位置进行处理:
螺纹1:1.5s
螺纹2:9s
螺纹3:18s
螺纹4:35s
等等。。。
造成这种行为的原因是什么?
暂无答案!
目前还没有任何答案,快来回答吧!