我问了这个问题(How do I call java.sql.Connection::abort?),这又引出了另一个问题。
使用
java.sql.Connection conn = ... ;
两者之间有什么区别
conn.close();
和
conn.abort(...);
?
答案 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--