Java / JDBC:发生异常时关闭数据库连接的最佳设计模式

时间:2012-06-22 16:42:13

标签: java database oracle jdbc

我是Java的新手(我正在使用Java 6)。我一直在使用以下设计模式为我的所有Java POJO和servlet通过GlassFish 3.1.2 Web服务器访问Oracle 11G数据库。

当所有可用的进程(或会话,不确定区别是什么)被消耗时,我得到间歇性数据库错误(ORA-12519),导致我以某种方式思考应用程序没有发布进程。 / p>

查看下面的设计模式,是否有更好的方法可以确保在发生异常时释放与数据库的JDBC连接?例如,我是否还应将if ( conn != null) conn.close();代码置于catch块中?或者,有更好的设计模式吗?提前感谢任何意见/提示。

public String MyFunction() throws Exception {     

    Connection conn;
    CallableStatement cs;

  try {

      Context context = new InitialContext();
      DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
      conn = ds.getConnection();        

      cs = conn.prepareCall( "{call my_sproc (?)}" );

      cs.registerOutParameter(1, Types.VARCHAR);

      cs.execute();

      String outParam = cs.getString(1); 

      if ( conn != null )  // close connection
         conn.close();

  } catch (Exception e) {
      outParam = "an error occurred";
  }
    return outparam;
}

4 个答案:

答案 0 :(得分:30)

if ( conn != null )  // close connection
         conn.close();

此行conn 不能为空。最流行的模式,直到Java 6:

Connection conn = null;
try {
   // initialize connection
   // use connection 
} catch {
  // handle exception
} finally {
  if (conn != null) {
     try { conn.close(); } catch (Exception e) { /* handle close exception, quite usually ignore */ } 
     }
}

使用 Java 7 ,使用try-with-resource构造时,这将变得不那么麻烦。上面的代码可以更改为更短的

try (Connection conn  = createConnection()) {
    // use connection 
} catch {
    // handle exception
}
// close is not required to be called explicitly

答案 1 :(得分:4)

始终使用finally块释放资源。

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。

  try {

      Context context = new InitialContext();
      DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
      conn = ds.getConnection();        

      cs = conn.prepareCall( "{call my_sproc (?)}" );

      cs.registerOutParameter(1, Types.VARCHAR);

      cs.execute();

      String outParam = cs.getString(1); 


  } catch (Exception e) {
      outParam = "an error occurred";
  }
 finally {
       conn.close();
    } 

答案 2 :(得分:2)

java se 7支持try-with-resources功能。为你生成终极。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

finally块将关闭try中的资源。就像你在c#

中使用关键字一样

但是用户正在使用java se6 ...请参阅其他用户的选项:)

重要提示:使用的语句也应该关闭。

答案 3 :(得分:2)

我更喜欢另一种更优雅的方式:

} finally {
  if (conn != null) {
     try {
         conn.close();
     } catch (Exception e) {
         /* handle close exception, quite usually ignore */
     } 
  }
}

您可以使用DbUtils.closeQuietly:http://commons.apache.org/dbutils/apidocs/org/apache/commons/dbutils/DbUtils.html