有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jdbc如何在退出之前强制关闭java中的数据库连接

我有一个多线程java应用程序,每个线程都可以使用数据库连接来查询数据。应用程序有时需要通过kill-1重新启动。但在退出之前,我们需要关闭所有连接。如果一个线程忙于处理一个查询,我们可以在另一个线程中强制关闭它吗


共 (2) 个答案

  1. # 1 楼答案

    javadoc for Connection.close说:

    "It is strongly recommended that an application explicitly commits or rolls back an active transaction prior to calling the close method. If the close method is called and there is an active transaction, the results are implementation-defined."

    因此,简单地从另一个线程对活动连接调用close()是个坏主意。此外,还不清楚事务被另一个线程回滚的线程会发生什么情况。我预计它会得到一个SQLException,但不清楚什么时候会发生

    备选方案:

    • @Basil Bourquesuggests正在中断正在使用连接的线程。问题将是确定要中断的正确线程。还不清楚JDBC驱动程序将做什么,以及被中断的线程是否能正确处理结果

    • 从Java7开始,Connection有一个abort(Executor)方法,可以异步地关闭连接并释放其资源。问题是,这可能需要很长时间才能完成。(使用Executor来运行一个将完成工作的任务。不幸的是,没有标准的方法来判断任务何时完成。)

    • 如果您有当前正在执行的Statement,可以对其调用cancel()。该javadoc说:

      "Cancels this Statement object if both the DBMS and driver support aborting an SQL statement. This method can be used by one thread to cancel a statement that is being executed by another thread.".

      如果cancel不受支持,则会出现异常


    总之:这可能是你想要避免做的事情。但如果必须这样做,则需要进行一些原型设计,以确定哪种方法最适合您的应用程序和正在使用的数据库驱动程序

  2. # 2 楼答案

    你问:

    can we force close it in another threads

    不。停止线程在Java中是协作的

    每个线程都带有一个“中断”标志,可以由另一个线程设置。必须编写在目标线程中运行的代码,以便检查该标志,然后做出相应的反应

    要设置标志,请参见^{}。有关executor服务管理的线程,请参见^{}

    要做出反应,请参见^{}^{}——一个清除标志,而另一个不清除

    例如,在通过ResultSet循环的代码中,在每个循环上检查中断标志

    while ( rs.next() ) {
        if( Thread.interrupted() ) { … handle interruption … }
        String sid = rs.getString( 1 ) ;
        String lid = rs.getString( 2 ) ;
        … do something with those values …
    }
    

    爪哇语Search to learn more about stopping threads