多线程查询oracle/java 7

jtw3ybtb  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(338)

我在尝试查询具有多个线程的大型表时遇到性能问题。我使用的是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
等等。。。
造成这种行为的原因是什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题