Tomcat JNDI连接池文档-随机连接关闭异常

Tomcat JNDI连接池文档-随机连接关闭异常,tomcat,connection,connection-pooling,Tomcat,Connection,Connection Pooling,我在Tomcat文档中找到了这个 我不明白的是,为什么它们两次关闭所有JDBC对象——一次在try{}块中,一次在finally{}块中。为什么不在finally{}子句中关闭它们一次呢 以下是相关文件: 随机连接关闭异常 我通常只在finally块中关闭一次连接,没有发现任何问题 然而,在更复杂的用例中可能需要双重关闭。例如,如果在try块中打开多个语句或多个连接,则希望在使用后立即关闭每个语句或连接。然后,您需要捕获由于finally块中的异常而遗留下来的任何内容。比如说, try {

我在Tomcat文档中找到了这个

我不明白的是,为什么它们两次关闭所有JDBC对象——一次在try{}块中,一次在finally{}块中。为什么不在finally{}子句中关闭它们一次呢

以下是相关文件:

随机连接关闭异常
我通常只在finally块中关闭一次连接,没有发现任何问题

然而,在更复杂的用例中可能需要双重关闭。例如,如果在try块中打开多个语句或多个连接,则希望在使用后立即关闭每个语句或连接。然后,您需要捕获由于finally块中的异常而遗留下来的任何内容。比如说,

try {
    conn = ds1.getConnection();
    ... Do something with datasource 1 ...
    conn.close();
    conn=null;

    conn = ds2.getConnection();
    ... Do something with datasource 2 ...
    conn.close();
    conn = null;
  } catch (SQLException e) {
    ... deal with errors ...
  } finally {
    if (conn != null) {
      try { conn.close(); } catch (SQLException e) { ; }
      conn = null;
    }
  }

或者,您可以使用SpringJDBC,忘记所有这些复杂问题(SpringJDBC将自动为您处理这些问题)

try {
    conn = ds1.getConnection();
    ... Do something with datasource 1 ...
    conn.close();
    conn=null;

    conn = ds2.getConnection();
    ... Do something with datasource 2 ...
    conn.close();
    conn = null;
  } catch (SQLException e) {
    ... deal with errors ...
  } finally {
    if (conn != null) {
      try { conn.close(); } catch (SQLException e) { ; }
      conn = null;
    }
  }