JDBC 连接关闭与中止

ryv*_*age 2 java jdbc

我问了这个问题(How do I call java.sql.Connection::abort?),它让我想到了另一个问题。

java.sql.Connection conn = ... ;
Run Code Online (Sandbox Code Playgroud)

有什么区别

conn.close();
Run Code Online (Sandbox Code Playgroud)

conn.abort(...);
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 7

您用于Connection.close()正常、同步、关闭连接。abort另一方面,该方法用于突然终止可能被卡住的连接。

在大多数情况下,您需要使用close(),但close()有时可能无法及时完成,例如,如果连接当前繁忙(例如执行长时间运行的查询或更新,或者可能等待锁定),它可能会阻塞。

abort方法适用于这种情况:驱动程序将立即将连接标记为关闭(希望),该方法返回,然后驱动程序可以使用提供的Executor异步执行必要的清理工作(例如,确保卡住的语句被中止) ,清理其他资源等)。

定义此方法时我还没有加入 JSR-221(JDBC 规范)专家组,但据我所知,此方法的主要目标用户并不是那么多应用程序代码,而是连接池、事务管理器和其他连接管理代码可能想要强制结束使用时间过长或“卡住”的连接。

也就是说,应用程序代码abort也可以使用。它可能比close(取决于实现)更快,但在异步清理期间您不会收到问题通知,并且您可能会中止当前正在进行的操作。

但请记住,anabort被认为是连接的突然终止,因此它可能不如 close 优雅,并且可能导致未指定的行为。另外,我不确定与普通的close().