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

如何覆盖一些java.sql.connection方法,如prepareStatement createStatement或prepareCall?,java,jdbc,Java,Jdbc,我想重写connection接口中的一些方法,以便在调用connection对象上的commit时关闭preparedStatements和ResultSets。我的代码库中有很多资源泄漏,作为一个故障保护,我想实现这个解决方案,在每次提交时,我可以查找所有打开的语句和结果集并关闭它们 但是,在本例中,我没有一个类可以重写和调用所有其他方法上的super()。作为连接返回的对象是动态代理-com.sun.proxy.$proxy。不确定如何为此对象调用我自己的方法。任何潜在客户都将受到高度赞赏

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

但是,在本例中,我没有一个类可以重写和调用所有其他方法上的super()。作为连接返回的对象是动态代理-com.sun.proxy.$proxy。不确定如何为此对象调用我自己的方法。任何潜在客户都将受到高度赞赏


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

您的JDBC库是开源的吗?然后下载JDBC版本的源代码,更改这一代码,再次生成JAR并使用它。当您这样做时,问题是代码中的所有“close”调用不再是合法的close类,而是冗余调用,在这种情况下,我不知道JDBC是否还会抛出一个异常(比如“connection is ready closed”),但如果是,您需要抑制异常或其他异常

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

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

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


我知道这正是您在这里试图避免的,那么我认为您应该尝试修改JDBC源代码并尝试一下。祝你一切顺利

如果您只是试图查找泄漏,为什么不使用调试器呢?您可以在每个相关方法上设置断点,并查看调用它们的位置,然后前进一步以确保它们正确关闭。作为一个额外的好处,如果有任何边缘情况妨碍正确关闭,您只需逐步阅读相关代码,就可以更快地找出需要修复的问题。

为什么不在完成连接后调用close?我建议使用try with resources或try finally block。@user506069感谢您的建议。在大多数我能找到问题的地方,我都是这样做的——转而尝试使用资源。然而,它是一个非常庞大的代码库,我想确定,即使我无法识别某些地方的资源泄漏。还希望确保未来的代码不会导致资源泄漏。正确实现的JDBC驱动程序将在提交时关闭结果集(除非您使用的是可保留的结果集)。我建议使用一个连接池库,当连接返回到池中时,它可以正确地关闭资源。您可以编写自己的类来实现连接,作为第三方连接对象前面的门面。在facade类调用library类之后,将您喜欢的任何自定义逻辑添加到facade类中。然后重构代码以使用facade类,而不是访问现有连接。感谢您的重要建议。我已经用jdbc实现细节更新了我的问题。修改外部库的源代码并在现有项目中使用它听起来很危险。如果您在JAR升级后看到这个问题,那么我认为您应该首先确定问题是与您的代码还是与库有关。在这种情况下,很多时候我们都会自寻烦恼。不过,你可以再试一次。您在JDBC中使用的接口很少,比如PreparedStatement/ResultSet等。我的下一个建议是对供应商实现类进行子类化(假设它们不是最终的),并调用实现方法中的所有“超级”实现。标准IDE功能将帮助您快速完成这项工作。完成后,在“整个项目”中“替换所有”导入以使用您现在实现的子类。现在,开始胡闹吧。嗨,湿婆,非常感谢你持续的帮助。但是,我无法确定供应商类别。我正在使用ojdbc实现,但在我的工作区中,引用与连接接口一起使用。此外,返回的连接对象是一个动态代理对象-com.sun.proxy.$proxy。这就是我无法扩展供应商的原因。是的,愚蠢的我,我应该意识到这一点。最好按照@user506069在评论中对您的问题所说的方式执行!这是我现在能想到的最好的办法。