需要给现有数据库业务系统做审计(有达梦数据库、MySQL、PgSQL等主流株距看),必须无侵入(不能改业务代码、配置、依赖,业务系统对我来说是黑盒的,无法修改任何东西),通过 JDBC 层捕获所有 SQL 语句和查询响应数据(结果集)
目前是通过java agent实现无侵入增强业务系统的,但是卡在了获取响应数据
环境:
JDK:8;
达梦数据库驱动:dm8
其他数据库暂未测试
因为游标默认是无法移动的,如果我在捕获响应数据时,移动了游标,那么业务系统将无法正常获取响应数据,我在尝试复原游标时也是无法正常复原
当前卡点:在达梦数据库下,CachedRowSet.populate () 会把原始 ResultSet 的游标移到末尾,尝试用以下代码恢复游标,但是无法成功,导致业务层拿不到响应数据
// 恢复游标代码 int originalRow = rs.getRow(); cachedRowSet.populate(rs); if (originalRow > 0) { rs.absolute(originalRow); // 达梦驱动下偶尔报SQL异常:无效的游标位置 } else { rs.beforeFirst(); }
目前尝试了:
- CachedRowSet:JDBC 标准接口,能离线缓存结果集,但
populate(ResultSet)会移动原始游标,导致业务系统读取数据时游标异常(比如 MyBatis 映射失败),尝试恢复游标(beforeFirst()/absolute()),但达梦驱动下部分场景恢复失败。
达梦或者其他数据库环境下,有没有稳定恢复 ResultSet 游标的方案?(最好有实测过的代码);
除了 CachedRowSet,有没有更轻量的无依赖方案,既能缓存结果集又不影响游标?
有没有大佬遇到过类似问题?求指点,感激不尽!🙏