jdbc如何在退出之前强制关闭java中的数据库连接
我有一个多线程java应用程序,每个线程都可以使用数据库连接来查询数据。应用程序有时需要通过kill-1重新启动。但在退出之前,我们需要关闭所有连接。如果一个线程忙于处理一个查询,我们可以在另一个线程中强制关闭它吗
你可以在下面搜索框中键入要查询的问题!
我有一个多线程java应用程序,每个线程都可以使用数据库连接来查询数据。应用程序有时需要通过kill-1重新启动。但在退出之前,我们需要关闭所有连接。如果一个线程忙于处理一个查询,我们可以在另一个线程中强制关闭它吗
# 1 楼答案
javadoc for
Connection.close
说:因此,简单地从另一个线程对活动连接调用
close()
是个坏主意。此外,还不清楚事务被另一个线程回滚的线程会发生什么情况。我预计它会得到一个SQLException
,但不清楚什么时候会发生备选方案:
@Basil Bourquesuggests正在中断正在使用连接的线程。问题将是确定要中断的正确线程。还不清楚JDBC驱动程序将做什么,以及被中断的线程是否能正确处理结果
从Java7开始,Connection有一个
abort(Executor)
方法,可以异步地关闭连接并释放其资源。问题是,这可能需要很长时间才能完成。(使用Executor
来运行一个将完成工作的任务。不幸的是,没有标准的方法来判断任务何时完成。)如果您有当前正在执行的
Statement
,可以对其调用cancel()
。该javadoc说:如果
cancel
不受支持,则会出现异常总之:这可能是你想要避免做的事情。但如果必须这样做,则需要进行一些原型设计,以确定哪种方法最适合您的应用程序和正在使用的数据库驱动程序
# 2 楼答案
你问:
不。停止线程在Java中是协作的
每个线程都带有一个“中断”标志,可以由另一个线程设置。必须编写在目标线程中运行的代码,以便检查该标志,然后做出相应的反应
要设置标志,请参见^{} 。有关executor服务管理的线程,请参见^{}
要做出反应,请参见^{} 和^{} ——一个清除标志,而另一个不清除
例如,在通过
ResultSet
循环的代码中,在每个循环上检查中断标志爪哇语Search to learn more about stopping threads