如何覆盖某些java.sql.connection方法,例如prepareStatement createStatement或prepareCall?

时间:2019-06-27 18:07:16

标签: java jdbc

我想重写连接接口中的某些方法,以在调用连接对象上的提交时关闭prepareStatements和resultsSets。我的代码库中有很多资源泄漏,作为一种故障保护,我想实现此解决方案,在每次提交时,我都可以查找所有打开的语句和结果集并关闭它们。

但是,在这种情况下,我没有一个类可以重写并在所有其他方法上调用super()。作为连接返回的对象是动态代理-com.sun.proxy。$ Proxy。不确定如何为该对象调用我自己的方法。任何线索都将受到高度赞赏。

PS:我在项目中使用了ojdbc8 jar,该jar最近已从ojdbc7升级。据我所知,我们在以前的版本中从未遇到过任何资源泄漏问题(例如超过了最大打开游标)。

2 个答案:

答案 0 :(得分:0)

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

但是这里的基本思想是您正在修改源,这有点冒险。

现在,即使您找到一个通用的修复程序,下一个问题也将是影响,其中没有人可以说出此影响,而其他人则应该批准此更改(假设这是大代码并且是一些项目)

因此,最好不要接受这样的事实,即过去有人做了一些糟糕的工作,而我们现在以正确的方式进行修复。

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

答案 1 :(得分:0)

如果您只是只是尝试查找泄漏,为什么不使用调试器呢?您可以在每个相关方法上设置断点,并查看它们的调用位置,然后继续进行操作以确保它们已正确关闭。另外一个好处是,如果存在任何阻止正常关闭的极端情况,您将单步执行相关代码,从而可以更快地找出需要解决的问题。