Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程查询Oracle/java 7_Java_Oracle_Jdbc_Jdbctemplate - Fatal编程技术网

多线程查询Oracle/java 7

多线程查询Oracle/java 7,java,oracle,jdbc,jdbctemplate,Java,Oracle,Jdbc,Jdbctemplate,我在尝试查询具有多个线程的大型表时遇到性能问题。 我正在使用Oracle、Spring2和Java7 我使用一个PoolDataSource(驱动程序oracle.jdbc.pool.OracleDataSource),其连接数与分析单个表的线程数相同。 我通过记录poolDataSource.getStatistics()来确保我在任何时候都有足够的可用连接 代码如下: ExecutorService executorService = Executors.newFixedThreadPool

我在尝试查询具有多个线程的大型表时遇到性能问题。 我正在使用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);
ExecutorService ExecutorService=Executors.newFixedThreadPool(nbThreads);
List foo=new ArrayList();
List callables=new ArrayList();
int offset=1;
while(offsetmaxreach){
可调用项。添加(新的可调用项){
@凌驾
public List call()抛出SQLException、InterruptedException{
返回dao.doTheJob(…);
}
});
偏移量+=10000;
}
for(Future-footfuture:executorService.invokeAll(callables)){
geometricincorrects.addAll(footfuture.get());
}
executorService.shutdown();
执行人服务。等待终止(1,时间单位。天);
在dao中,我使用来自PoolDataSource的连接和SpringJDBCTemplate.query(query、PreparedStatementSetter、RowCallBackHandler)。
doTheJob
方法对每个查询结果执行完全相同的操作

我的查询如下:
从My.BIGTABLE OFFSET中选择A、B、C?下一个?仅行

总之,我有n个线程被FixThreadPool调用,每个线程处理完全相同的数据量,做完全相同的事情。 但是每个线程的完成时间都比最后一个线程的完成时间长

例如: 4个线程同时启动,但每个结果集的第一行(即RowCallbackHandler中的第一行)在以下位置处理:

  • 螺纹1:1.5s
  • 螺纹2:9s
  • 螺纹3:18s
  • 螺纹4:35s
等等

这种行为的原因是什么

编辑:

问题的主要原因是在已处理的表本身内。 使用偏移量x行仅获取下一个y行,Oracle需要从一行开始遍历所有行

所以访问偏移量10比访问偏移量10000000快


我能够通过临时表和良好的索引获得良好的响应时间。

如果您只需要从表中提取所有数据,那么最好只运行一个查询,而不使用任何线程或分页,并设置足够大的值(默认值仅为10行/结果集)。也许先试试吧?你需要从数据库端追踪它。请DBA查找并跟踪此查询(
alter system set events'sql\u trace[sql:sql\u id\u of\u your\u query]level=12';