0

プレーンな JDBC 接続内で SQL クエリを実行するために繰り返し使用されるメソッドのステートレス セッション Bean があります。接続を頻繁に開いたり閉じたりする必要がないように、私は次のアプローチを思いつき、それが良い習慣であるかどうか疑問に思いました。

@PostConstruct アノテーションが付けられたメソッドで接続を 1 回開き、@PreDestroy アノテーションが付けられた別のメソッドで接続を閉じます。

コードは問題なく動作し、明らかなメモリ リークや私が知っている問題はありません。より経験豊富な開発者が、それが適切な方法であるかどうかに同意するかどうか疑問に思っています。

@PostConstruct
public void initBean() {
   try {
      conn = Connector.getConnection();
   } catch (Exception e) {
      // Handle errors for Class.forName
      e.printStackTrace();
   }
}

public String runTheQuery(String sql) {
   String result ="";
   try {
      pstmt = conn.prepareStatement(sql);
      rs = pstmt.executeQuery();
      result = rs.getString(1);
      rs.close();
      pstmt.close();
   } catch (SQLException se) {
      // Handle errors for JDBC
   }
   return result;
}

@PreDestroy
public void endingTitles() {
   System.out.println("Closing the JDBC connection...");
   try {
      rs.close();
      conn.close();
      pstmt.close();
   } catch (SQLException se) {
      // Handle errors for JDBC
      se.printStackTrace();
   } catch (Exception e) {
      e.printStackTrace();
} finally {
            // finally block used to close resources
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException se2) {
            }// nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }// end finally try
        }// end try
    }
4

2 に答える 2

5

最善の解決策は、DataSource を使用することです

@Resource(mappedName="java:/DefaultDS")
DataSource dataSource;

public String runTheQuery(String sql) throws SQLException 
    Connection con = dataSource.getConnection();
    try {
       ...
    } finally {
        con.close();
    }
}
于 2013-09-24T07:00:41.247 に答える
1

通常、データ ソースには常に最小数の開いている接続があるため、ほとんどの場合、データ ソースから接続を取得するための実際のオーバーヘッドはありません。

したがって、以前に測定したことがある場合にのみ有効な方法であり、既存のパフォーマンスの問題を実際に解決します

それ以外の場合は一般的ではないため、時期尚早のパフォーマンス最適化のようなものです。

データ ソースは追加の機能を提供します。たとえば、接続がまだ有効であるかどうかを、接続が挿入される前にチェックします。自分でやった場合は、再実装する必要があります。そして、そのコードにエラーがある可能性があります。

于 2013-09-24T08:00:27.230 に答える