[java] プールでのJDBC接続のクローズ



Answers

通常、プールはラップされたConnectionオブジェクトを返します。ここでは、close()メソッドがオーバーライドされ、通常はConnectionをプールに返します。 close()を呼び出すことはOKであり、おそらくまだ必要です。

close()メソッドはおそらく次のようになります:

public void close() throws SQLException {
  pool.returnConnection(this);
}

2番目の質問では、ロガーを追加して、ボトムブロックが実行されているかどうかを表示できます。 私はあなたがデータベース接続の構成のために一方向または他の方法だけを望むだろうと想像しています。 私たちはデータベースアクセスのためにプールを単独で使用します。 いずれにしても、リークを防ぐには接続を閉じることが非常に重要です。

Question

JDBCを使用するための私たちの標準コードセクションは...

Connection conn = getConnection(...);
Statement  stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
ResultSet  rset = stmt.executeQuery (sqlQuery);

// do stuff with rset

rset.close(); stmt.close(); conn.close();

質問1:接続プールを使用する場合、最後に接続を閉じる必要がありますか? もしそうなら、プールする目的は失われていませんか? そうでない場合は、Connectionの特定のインスタンスが解放され、再利用できるかどうかデータソースがどのように認識しますか? 私はこの1つで少し混乱しています。

質問2:次の方法は、標準に近いものですか? プールからの接続を試みるように見えますが、DataSourceを確立できない場合は、旧式のDriverManagerを使用してください。 実行時にどの部分が実行されているのかはわかりません。 このような方法からConnectionが終了すると、上記の質問が繰り返されます。

ありがとう、 - MS。

synchronized public Connection getConnection (boolean pooledConnection)
                                                        throws SQLException {
        if (pooledConnection) {
                if (ds == null) {
                        try {
                                Context envCtx = (Context)
                                        new InitialContext().lookup("java:comp/env");
                                ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
                                return ds.getConnection();
                        } catch (NamingException e) {
                                e.printStackTrace();
                }}
                return (ds == null) ? getConnection (false) : ds.getConnection();
        }
        return DriverManager.getConnection(
                "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}

編集:スタックトレースが表示されないので、私たちはプールされた接続を取得していると思います。




Related