当前位置:网站首页>jdbc ResultSetMetaData获取tableName问题
jdbc ResultSetMetaData获取tableName问题
2022-07-30 07:20:00 【hay_lee】
1.问题
有一个项目客户提出对已上线项目,不改代码的情况下,并且只能提供是jdbc连接与数据库mysql、oracle两种。对客户的需求做了大量的技术调研,mysql jdbc驱动可以使用自定义拦截器实现,但是oracle jdbc驱动没有这个。后来考虑使用java字节码增强形式对jdbc返回结果做拦截脱敏。但是在脱敏的过程当中发现oracle jdbc驱动执行完的sql ResultSet获取ResultSetMetaData中的getTableName方法获取的表名为空。
2.寻找解决方法
因为制定的脱敏规则设置某个表某个字段按照某种规则脱敏。但是现在oracle jdbc驱动无法获取TableName。
经过查oracle官方发现:


可以这么设置(注意:这里只举个例子,其他属性没加)
Properties info = new Properties();
info.setProperty("ResultSetMetaDataOptions","1");
jdbcHandler = JdbcHandler.newJdbcHandler(url, info);但是设置完依然获取不到TableName。
无奈去翻oracle ojdbc源码发现

发现源码未实现。
最后想用实际项目postgres做测试发现增强后查询数据库死循环,翻看源码:


pg查询表名是去再次用sql查询数据库,因为增强的返回结果方法查询表名触发继续去查表名就成了死循环。
最终无奈oracle、postgres只能根据列别名脱敏,无法知道表放弃。mysql可以获取表名、原始表列名、列别名、用户名、数据库名,完全按照这些制定规则脱敏。这篇文章是提醒大家避免入坑,解决方法还在继续探索中。。。
边栏推荐
猜你喜欢
随机推荐
Link with Bracket Sequence II(杭电多校赛)
sizeof
2020 ACM | MoFlow: An Invertible Flow Model for Generating Molecular Graphs
Keil compile size and storage instructions
开创ETC生态建设新格局 JASMINER新一批X4服务器陆续发出
redis常用指令
ipset restore命令维护set,但原已存在的条目未删除掉
cmd命令
input标签的tabindex属性 & a标签的tabindex属性
mysql8的my.conf配置文件参考指引
What convenience does the RFID fixed asset inventory system bring to enterprises?
The blockbuster IP that has been popular in the world for 25 years, the new work has become a script paradise
selenium模块
一文带你玩转offer-01
c语言变量的存储方式和生存期 -考察
Judging from the Internet:
Alibaba Cloud Cloud Server Firewall Settings
手把手教学OneOS FOTA升级
39.【vector动态数组定义及初始化】
ES: 箭头函数和包裹它的代码共享相同的this








