JDBC连接关闭与中止

时间:2018-08-08 17:39:37

标签: java jdbc

我问了这个问题(How do I call java.sql.Connection::abort?),这又引出了另一个问题。

使用

java.sql.Connection conn = ... ;

两者之间有什么区别

conn.close();

conn.abort(...);

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

但是请记住,abort被认为是连接的突然终止,因此它可能不如关闭而优雅,并且可能导致不确定的行为。另外,我不确定与常规close()相比,驱动程序对它的支持程度如何。

答案 1 :(得分:0)

咨询Java文档似乎表明中止比关闭更彻底,这很有趣。

中止...

  

终止打开的连接。调用中止的结果为:   标记为关闭的连接关闭与该连接的任何物理连接   数据库释放连接使用的资源确保任何   当前正在访问连接的线程将继续执行   完成或引发SQLException。

关闭...

  

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

因此,如果您仅考虑释放对象,请使用close。如果要确保它更“线程安全”,则使用abort似乎可以提供更优雅的断开连接。

根据Mark Rotteveel的评论(给出了实际差异的准确摘要),我的解释是错误的。

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