15

アプリケーションにデータソースを挿入し、getConnection()それを呼び出して接続を取得する場合、接続を閉じる必要がありますか?

4

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