多线程使用同一个connection数据库连接的问题

CocoPig 2016-08-15 04:17:30
因为业务上的原因,决定在多线程中使用同一个connection,先是在主线程做了insert操作,然后从同一张表中分段取list给多个子线程执行遍历处理,在子线程执行过程中又操作更新数据表。
子线程分别跑了几十次的遍历后陆续抛出如下异常:

[pool-1-thread-1] [PreparedStatementPool.java:166] ERROR - exitImplicitCacheToClose error
java.sql.SQLRecoverableException: Closed Statement
at oracle.jdbc.driver.OracleClosedStatement.exitImplicitCacheToClose(OracleClosedStatement.java:4686) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatementWrapper.exitImplicitCacheToClose(OraclePreparedStatementWrapper.java:1621) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at com.alibaba.druid.util.OracleUtils.exitImplicitCacheToClose(OracleUtils.java:72) ~[druid-1.0.15.jar:1.0.15]
at com.alibaba.druid.pool.PreparedStatementPool.closeRemovedStatement(PreparedStatementPool.java:164) [druid-1.0.15.jar:1.0.15]
at com.alibaba.druid.pool.PreparedStatementPool$LRUCache.removeEldestEntry(PreparedStatementPool.java:192) [druid-1.0.15.jar:1.0.15]
at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:431) [na:1.7.0_79]
at java.util.HashMap.put(HashMap.java:505) [na:1.7.0_79]
at com.alibaba.druid.pool.PreparedStatementPool.put(PreparedStatementPool.java:91) [druid-1.0.15.jar:1.0.15]
at com.alibaba.druid.pool.DruidPooledConnection.closePoolableStatement(DruidPooledConnection.java:163) [druid-1.0.15.jar:1.0.15]
at com.alibaba.druid.pool.DruidPooledPreparedStatement.close(DruidPooledPreparedStatement.java:201) [druid-1.0.15.jar:1.0.15]

子线程操作表的某个方法如下:

private void updateKJMJE(Connection con,String contract_no,BigDecimal kjmje) throws SQLException{
String sql = " update tbl_pb_casemain set DEDUCTIBLE_AMOUNT=? where pk_bill=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setBigDecimal(1, kjmje);
pstmt.setString(2, contract_no);
pstmt.execute();
if(pstmt!=null&&!pstmt.isClosed()){
pstmt.close();
}
}

已经开启了事务,在全部的代码都执行完之后才会最终手工提交。
求问上面抛出的异常是什么原因,这个问题都快烦扰我两天了。
...全文
1140 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
会不会是数据库连接没有回收? 参考 或者说是不是连接没有关闭? 参考

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧