java - 如何覆盖一些 java.sql.connection 方法,如 prepareStatement createStatement 或 prepareCall?
问题描述
我想重写连接接口中的一些方法,以在调用连接对象上的提交时关闭preparedStatements 和resultSets。我的代码库中有很多资源泄漏,作为故障保险,我想实现这个解决方案,在每次提交时,我都可以查找所有打开的语句和结果集并关闭它们。
然而,在这种情况下,我没有一个类可以覆盖并在所有其他方法上调用 super()。作为连接返回的对象是一个动态代理 - com.sun.proxy.$Proxy。不确定如何为此对象调用我自己的方法。任何线索都受到高度赞赏。
PS:我在项目中使用的是一个ojdbc8 jar,它是最近从ojdbc7升级而来的。据我所知,在之前的版本中,我们从未遇到过任何资源泄漏问题(如超出最大打开游标)。
解决方案
你的 JDBC 库是开源的吗?然后下载 JDBC 版本的源代码,更改这一代码,再次生成 JAR 并改用它。当你这样做时,问题是代码中的所有“关闭”调用不再是合法的关闭类,而是冗余调用,在这种情况下,我不知道 JDBC 是否会再抛出一个异常(类似于'连接已经关闭')与否,但如果是,则需要抑制异常或其他内容。
但是这里的基本想法是您正在修改源,这有点冒险。
现在,即使你找到了一个常见的修复,下一个问题是关于影响的,包括你在内的任何人都不能说出这个的影响,并且其他人应该批准这个更改(假设这是一个大代码并且是某个项目)。
因此,与其做这样的事情并引发新的问题,不如接受这样一个事实,即过去有人做了一些糟糕的工作,我们现在以正确的方式解决它。
我知道这正是您在这里要避免的,那么我认为您应该尝试修改 JDBC 源并试一试。一切顺利!
推荐阅读
- c# - 如何将白色添加到 Web 视图背景
- python-3.x - 如果我离开'for'语句,数据将消失
- javascript - 如何监听自己触发的 Socket 事件
- java - 使用 DatePicker 的当前值作为另一个 DatePicker 的最小值/最大值
- c# - 在并发字典c#上工作的两个计时器
- python - css没有在webpy中加载
- android - 如何通过recyclerview中的所有视图进行重申?
- azure-service-fabric - Service Fabric 重新启动应用程序
- java - 是否可以在没有抽象方法的情况下执行接口?
- angular - kendo-angular-upload:500 服务器错误代码后未触发错误事件