为了账号安全,请及时绑定邮箱和手机立即绑定

如何覆盖一些 java.sql.connection 方法,如 prepareStatement

如何覆盖一些 java.sql.connection 方法,如 prepareStatement

回首忆惘然 2023-02-23 18:11:16
我想覆盖连接接口中的一些方法,以便在调用连接对象上的提交时关闭 preparedStatements 和 resultSets。我的代码库中有很多资源泄漏,作为故障保护,我想实现这个解决方案,在每次提交时,我都可以查找所有打开的语句和结果集并关闭它们。但是,在这种情况下,我没有一个类可以在所有其他方法上覆盖和调用 super() 。作为连接返回的对象是动态代理 - com.sun.proxy.$Proxy。不确定如何为这个对象调用我自己的方法。任何线索都受到高度赞赏。PS:我在项目中使用的是ojdbc8的jar,是最近从ojdbc7升级而来的。据我所知,我们在以前的版本中从未遇到过任何资源泄漏问题(例如超出最大打开游标数)。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您的 JDBC 库是开源的吗?然后下载 JDBC 版本的源代码,更改这一代码,再次生成 JAR 并使用它。当您这样做时,问题是代码中的所有“关闭”调用不再是合法的关闭类,而是冗余调用,在这种情况下,我不知道 JDBC 是否会再抛出一个异常(类似于'连接已经关闭')或没有,但如果是,你需要抑制异常或其他东西。

但这里的基本思想是您正在修改源代码,这是有风险的。

现在,即使你找到了一个通用的修复,下一个问题是关于影响的,包括你在内的任何人都不能说出这个的影响,其他人应该批准这个改变(假设这是一个大代码并且是某个项目)。

因此,与其做这样的事情并引发新问题,不如接受这样一个事实,即过去有人做过一些糟糕的工作,我们现在以正确的方式解决它。

我知道这正是您在这里要避免的,那么我认为您应该尝试修改 JDBC 源并试一试。一切顺利!


查看完整回答
反对 回复 2023-02-23
?
MMTTMM

TA贡献1869条经验 获得超4个赞

如果您只是想查找泄漏,为什么不改用调试器呢?您可以在每个相关方法上设置断点并查看调用它们的位置,然后继续检查以确保它们已正确关闭。作为一个额外的好处,如果有任何边缘情况阻止正确关闭,您将只是单步执行相关代码,因此您可以更快地找出需要修复的内容。



查看完整回答
反对 回复 2023-02-23
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信