2

我正在构建一个带有自定义“连接”类的 JCA 适配器。在我见过的所有示例中,您应该在连接类中放置一个“void close()”。然后在使用您的自定义连接类时,您必须在 finally 块中调用 close() 。

我真的不相信开发人员记得在 finally 块中关闭。此外,我不必在 EntityManager 上调用“close()”。容器自动管理 EntityManager 的打开和关闭。

有没有办法让容器自动关闭与我的 JCA 适配器的任何连接?我尝试过覆盖 finalize(),但在 JVM 决定清理我的连接之前可能需要很长时间。

或者,如果有人知道如何为 findbugs 编写一个插件来标识在 finally 块中使用自定义连接类而不使用 close() 的任何地方......我可能会同意。

4

1 回答 1

1

如果您了解您的工作流程,您可以在您的连接上进行后台线程监视活动,并在一定时间(10 秒、30 秒、2 小时等)后关闭任何内容。

正如您所提到的,您还可以覆盖 finalize 方法。它是可用的,只是不能保证。但是在任何相当繁忙的服务器上,您可能会获得足够的 GC 活动以使其及时关闭大部分连接。finalize 不能保证的警告只是接受如果有人终止进程(或者它出现故障或其他什么),您的 finalize 将不会被调用。

最后,通过简单地创建一个新异常并填写其堆栈跟踪,可以直接捕获创建连接的位置。在打开的连接中保留该异常,当您检测到您被“强制”关闭它(通过时间、最终确定或其他方式)时,您可以简单地将异常转储到您的日志中以找到有问题的“打开”行一个连接。

当连接器被销毁或取消部署(即从服务器中删除模块或服务器关闭时)时,您应该与 JCA 生命周期相关联。这可以告诉您哪些连接处于打开状态,模块正在被移除。

于 2012-01-04T01:17:23.777 回答