java - 发生异常时关闭数据库连接的最佳设计模式

标签 java oracle jdbc

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

当所有可用进程(或 session ,不确定有什么区别)都被消耗时,我遇到间歇性数据库错误 (ORA-12519),导致我以某种方式认为应用程序未释放进程。

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

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

最佳答案

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

关于java - 发生异常时关闭数据库连接的最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11160557/

相关文章:

java - 在 Selenium 中,无法单击错误消息 'OK' 按钮

java - java中的"Final"和复制二维数组

在 where 子句中的 Oracle 集合

sql - REGEXP_LIKE 用于 5 个字符的子字符串内任意位置的字符

sql - 使用 PL/SQL 表避免使用 SELECT 进行全表扫描

mysql - java.sql.BatchUpdateException : transaction too large, 长度:300200

java - HK2 类型文字和通配符

java - IllegalAnnotationExceptions 元素没有带有 @XmlElementDecl 的 ObjectFactory

java - MS SQL JDBC - SQLServerCallableStatement -execute() 返回 false

java - Google Cloud SQL-无法连接到 MySQL 数据库