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

最近,公司准备做合服,我主要负责解决数据库和数据库相关底层框架的问题。
我们公司的数据量比较大,两个目标数据库每个大小都在两百多个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的预编译语句的缓存。

猜你喜欢

转载自yuwenbao.iteye.com/blog/1908286