9

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

当所有可用进程(或会话,不确定有什么区别)都被消耗时,我收到间歇性数据库错误(ORA-12519),这让我认为应用程序没有释放进程。

看看下面的设计模式,有没有更好的方法来确保在发生异常时释放与数据库的 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

4 回答 4

31
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
于 2012-06-22T16:47:26.037 回答
4

始终使用finally块来释放资源。

finally 块总是在 try 块退出时执行。这样可以确保即使发生意外异常也会执行 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();
    } 
于 2012-06-22T16:43:23.380 回答
2

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

finally 块将关闭 try 中分配的资源。就像您在 c# 中使用关键字 using

但是用户正在使用java se6 ...查看其他用户的选项:)

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

于 2012-06-22T16:58:49.070 回答
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

于 2012-06-22T17:42:14.823 回答