多线程查询Oracle/java 7
我在尝试查询具有多个线程的大型表时遇到性能问题。 我正在使用Oracle、Spring2和Java7 我使用一个PoolDataSource(驱动程序oracle.jdbc.pool.OracleDataSource),其连接数与分析单个表的线程数相同。 我通过记录多线程查询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
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
我能够通过临时表和良好的索引获得良好的响应时间。如果您只需要从表中提取所有数据,那么最好只运行一个查询,而不使用任何线程或分页,并设置足够大的值(默认值仅为10行/结果集)。也许先试试吧?你需要从数据库端追踪它。请DBA查找并跟踪此查询(
alter system set events'sql\u trace[sql:sql\u id\u of\u your\u query]level=12';
)