JDBC连接关闭与中止

我问了这个问题( 如何调用java.sql.Connection :: abort? ),这引出了另一个问题。

java.sql.Connection conn = ... ; 

有什么区别

 conn.close(); 

 conn.abort(...); 

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

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

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

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

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

但请记住, abort被认为是连接的突然终止,因此它可能不如关闭优雅,并且可能导致未指定的行为。 此外,我不确定驱动程序与普通close()相比支持得多好。

咨询java文档似乎表明abort比close更彻底,这很有趣。

中止…

终止打开的连接。 调用中止导致:标记为关闭的连接关闭与数据库的任何物理连接释放连接使用的资源确保当前正在访问连接的任何线程将进入完成或抛出SQLException。

关…

立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。 在已关闭的Connection对象上调用close方法是无操作。

因此,如果您只关心释放对象,请使用close。 如果你想确保它更“线程安全”,使用abort似乎可以提供更优雅的断开连接。

Per Mark Rotteveel的评论(给出了实际差异的准确总结),我的解释是不正确的。

参考: https : //docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#close–