为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 6/7/8
【操作系统】:mac
【CPU】: i7
【问题描述】*: 我正在基于Java Agent技术开发一个数据库监控插件,需要无侵入地捕获达梦数据库的SQL执行请求和响应数据。目前在不同版本的达梦中遇到了技术难题,特来请教。
🎯 当前实现方案
在达梦8中,我通过拦截 dm.jdbc.driver.DmdbPreparedStatement.execute 方法成功获取了SQL请求信息。但对于响应数据,由于ResultSet游标不支持重置,如果在插件中移动游标读取数据,会导致业务层无法获取原始数据。
因此,我采用了反射访问ResultSet内部的 datas 字段(类型为 byte[][][]),通过解析字节数据来获取响应内容。这种方法基本可行,但遇到了日期类型数据解析异常的问题。
❌ 遇到的核心问题
达梦8的日期解析问题
从 datas 字段解析出的字节数据中,日期类型的值无法正确转换
尝试了多种编码和转换方式均未成功
达梦7的结构差异
在达梦7中未找到与达梦8类似的 datas 字段结构,无法通过相同方式获取响应数据
游标冲突风险
直接操作ResultSet游标会影响业务正常使用
💡 寻求解决方案
希望有达梦JDBC内部实现经验的大佬能够指点:
游标问题
是否有方法在不影响业务层的情况下复制或备份ResultSet状态?或者存在其他方式可以无冲突地读取响应数据?
数据解析
对于达梦8中 datas 字段的日期类型数据,正确的解析方法是什么?字节结构有何特殊约定?
达梦6/7兼容
在达梦6和7中,应该如何正确获取SQL响应数据?是否存在类似的内部字段或替代方案?
🔧 技术环境
监控技术:Java Agent + ByteBuddy
数据库版本:达梦8、达梦7、达梦6
JDBC驱动:对应版本的达梦官方驱动
