首页 > 解决方案 > 如何覆盖一些 java.sql.connection 方法,如 prepareStatement createStatement 或 prepareCall?

问题描述

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

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

PS:我在项目中使用的是一个ojdbc8 jar,它是最近从ojdbc7升级而来的。据我所知,在之前的版本中,我们从未遇到过任何资源泄漏问题(如超出最大打开游标)。

标签: javajdbc

解决方案


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

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

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

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

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


推荐阅读