需要给现有数据库业务系统做审计(有达梦数据库、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();
}达梦或者其他数据库环境下,有没有稳定恢复 ResultSet 游标的方案?(最好有实测过的代码);
除了 CachedRowSet,有没有更轻量的无依赖方案,既能缓存结果集又不影响游标?
有没有大佬遇到过类似问题?求指点,感激不尽!🙏
项目结构
ProxyDriver.java
ProxyConnection.java
ProxyStatement.java
ProxyPreparedStatement.java
ProxyResultSet.java
Agent.java
工作原理: