问题描述
- JDBC一个connection下多线程查询表数据会产生线程等待
-
案例:
从Oracle数据库将表及数据通过JDBC的方式采集到另一Oracle数据库,数据量均为千万级,从源数据库读取的时候采用ORACLE的ROWNUM分页方式,JDBC每次读取1000条,批量插入目标库,测试发现ORACLE的ROWNUM分页效率很是问题,越到后面越慢,WEBLOGIC后台甚至出现线程请求超时。
后来采用多线程的方式,创建一个连接,后台起100个线程,测试发现跟单线程的效率差不了多少,分析代码后,线程在创建preparedStatement时会产生等待,是不是创建preparedStatement时资源会互斥?搞不明白。
示例代码:... ExecutorService threadPool = Executor.newFixedThreadPool(100); Futrue futrue = null; for(int i=0; i<=recordNum/1000;) { for(int j=0; j<100; j++) { final int m = i; futrue = threadPool.submit( new Callable() { Object[][] o = null; public void call() { //就是下面这句多线程下查询执行时间越往后越慢 o = odsDB.executeBatchQuery(tableName, MAX_BATCH_NUM*m, MAX_BATCH_NUM); if(o != null) { toDB.executeBatchInsert(insertSQL, o); toDB.commit(); } } }); i++; } } threadPool.shutdown(); while(true) { if(threadPool.Terminated()) { break; } Thread.sleep(2000); } ..... 被调用的odsDB.executeBatchQuery()方法 Object[][] o = null; PreparedStatement ps = null; ResultSet rs = null; String queryStr = null; try{ queryStr = "SELECT * FROM ( SELECT A.*, ROWNUM RN FROM " + tabName + " A WHERE ROWNUM <=? ) WHERE RN > ?"; ps = this.conn.preparedStatement(queryStr); //100条多线程下此代码执行时长越来越长。 ps.setLong(1, count+offset); ps.setLong(2, count); rs = ps.executeQuery(); } catch(Exception e) { } //下面代码将rs转成Obejct[][]返回 求各路大侠帮忙这个问题要怎么解决。
解决方案
会不会是ORACLE限制线程连接数量啊
时间: 2024-10-11 18:07:42