我正在构建一个带有自定义“连接”类的JCA适配器。在我看过的所有例子中,你应该在你的连接类中放入一个“void close()”。然后在使用自定义连接类时,必须在finally块中调用close()。
我真的不相信开发人员会记得把它放在finally块中。另外,我不必在EntityManager上调用“close()”。容器自动管理EntityManager的打开和关闭。
有没有办法让容器自动关闭与JCA适配器的任何连接?我已经尝试重写finalize(),但是在JVM决定清理我的连接之前可能需要很长时间。
或者,如果有人知道如何为findbugs编写一个插件来识别身份,那么在finally块中没有close()的情况下使用自定义连接类......我可能会对此感到满意。
答案 0 :(得分:1)
如果你知道你的工作流程,你可以在你的连接上有一个后台线程观察活动,并在一定时间后(10s,30s,2hrs,无论如何)关闭任何东西。
如您所述,您还可以覆盖finalize方法。它可以使用,但不能保证。但是在任何相当繁忙的服务器上,您可能会获得足够的GC活动,以便及时关闭大部分连接。最终确定无法保证的警告只是接受如果某人杀死了这个过程(或者它有缺陷或其他什么),那么你的终结将不会被调用。
最后,通过简单地创建一个新的Exception并填充其堆栈跟踪,可以直接捕获创建连接的位置。使用打开的连接保持该异常,并且当您检测到“被迫”关闭它时(通过时间,最终确定或其他),您可以简单地将异常转储到日志中以查找有问题的“打开”行一个连接。
当连接器被销毁或取消部署时(即从服务器中删除模块或服务器关闭时),您应该与JCA生命周期联系起来。这可以告诉你什么连接打开了模块被删除。