有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jdbc如何覆盖一些java。sql。连接方法,如prepareStatement createStatement或prepareCall?

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

然而,在本例中,我没有一个类可以重写和调用所有其他方法的super()。作为连接返回的对象是动态代理-com。太阳代理$代理不知道如何为这个对象调用我自己的方法。任何线索都将受到高度赞赏

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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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