的Java / JDBC:最佳设计模式,当出现异常时关闭数据库连接(Java / JDBC: Bes

2019-06-25 16:59发布

我是新来的Java(我使用的Java 6)。 我一直在使用我的所有Java的POJO和servlet下面的设计模式访问通过3.1.2的GlassFish 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;
}

Answer 1:

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 (Connection conn  = createConnection()) {
    // use connection 
} catch {
    // handle exception
}
// close is not required to be called explicitly


Answer 2:

使用finally块总是以释放资源。

finally块总是执行try块退出时。 这保证了即使发生了意外的异常的最后块被执行。

  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();
    } 


Answer 3:

Java SE 7中支持的try-与资源的功能。 产生最终为您服务。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

finally块将关闭在try alocated的资源。 就像你正在使用使用C#关键字

但是用户在使用的Java SE6 ...查看其他用户的选择:)

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



Answer 4:

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

} 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



文章来源: Java / JDBC: Best design pattern to close database connection when exception occurs