アプリケーションにデータソースを挿入し、getConnection()
それを呼び出して接続を取得する場合、接続を閉じる必要がありますか?
14262 次
2 に答える
22
データソース自体はコンテナで管理されていますが、API では実際にプログラマが接続を閉じる必要があります。これは、コンテナーがクローズを処理する他のいくつかのコンテナー管理リソース (エンティティーマネージャーなど) とは異なります。ほとんどの場合、ここで閉じても実際にはここで接続が閉じられるのではなく、接続が接続プールに戻されることに注意してください。
経験則として、ファクトリっぽいリソースを使用して、閉じることができる他のリソースを 1 つ以上取得する場合は、それらを閉じる必要があります。それ以外の場合は、コンテナーがこれを行います。
ConnectionはAutoCloseableを実装しているため、これには try-with-resources ブロックを使用できます。
@Stateless
public class MyBean {
@Resource(lookup = "java:/app/datasource")
private DataSource dataSource;
public void doStuff() {
try (Connection connection = dataSource.getConnection()) {
// Work with connection here
} catch (SQLException e) {
throw new SomeRuntimeException(e);
}
}
}
于 2012-11-25T15:34:18.597 に答える
5
もちろん、そうしないと、接続プールを使い果たしてしまいます。finally ブロックでこれを行うのが最善です:
@Resource(mappedName="jndi/yourDatasource")
DataSource ds;
..
Connection conn = null;
try {
conn = ds.getConnection();
//PERFORM QUERY, ETC..
}
catch(SQLException ex) {
//EXCEPTION HANDLING
}
finally {
try {
if(conn != null)
conn.close();
}
catch(SQLException ex) {..}
}
于 2012-11-25T15:09:18.517 に答える