合服时出现的结果集耗尽的现象原因

最近,公司准备做合服,我主要负责解决数据库和数据库相关底层框架的问题。
我们公司的数据量比较大,两个目标数据库每个大小都在两百多个g左右,合服用的是公司自己的simplejpa框架,在合服时,问题出现了,在底层的日志中显示出结果集耗尽的问题,我需要查出此问题的原因,并提供出解决方案来。
结果集耗尽说明resultset这个对象做了不应该做的next操作,可是找遍代码也未发现相关的错误逻辑,于是便想是否会有某些操作暗含了next操作,于是反编译了下ojdbc6的jar包,发现相关操作未有next操作,于是又仔细看了下底层日志,发现每次结果集耗尽时,日志总是有一个线程在跑和合服一样的sql语句,故想到 是否resultset有缓存会被重用,于是去看了oracle.jdbc.driver.OraclePreparedStatement的代码 ,发现没有缓存resultset 于是又找到OracleResultSetImpl的next实现,发现他本质上是调用了close_or_fetch_from_next这个方法 在这个方法中 它调用了OraclePreparedStatement的nextstream的属性 本质上就是将OraclePreparedStatement看成了一个链表 不断的往下找到最后一个nextstream 这里如果在connection中设置了preparedstatement的缓存 则 将会出现问题。所以,解决办法是 要么不要启动那个并行执行相同sql语句的线程,要么不设置connection的预编译语句的缓存。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值