9

私はJavaを初めて使用します(Java 6を使用しています)。すべてのJavaPOJOとサーブレットに以下のデザインパターンを使用して、GlassFish3.1.2Webサーバーを介してOracle11Gデータベースにアクセスしています。

使用可能なすべてのプロセス(またはセッション、違いがわからない)が消費されると、断続的なデータベースエラー(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();

この行でnullに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ブロックは、試行で割り当てられたリソースを閉じます。C#で使用しているキーワードを使用していたように

ただし、ユーザーはjavase6を使用しています...他のユーザーのオプションを参照してください:)

重要:使用されているステートメントも閉じる必要があります。

于 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 に答える