31

以下は、DB 接続を取得するためのヘルパー クラスです。

here で説明されているように、C3P​​0 接続プールを使用しました。

public class DBConnection {

    private static DataSource dataSource;
    private static final String DRIVER_NAME;
    private static final String URL;
    private static final String UNAME;
    private static final String PWD;

    static {

        final ResourceBundle config = ResourceBundle
                .getBundle("props.database");
        DRIVER_NAME = config.getString("driverName");
        URL = config.getString("url");
        UNAME = config.getString("uname");
        PWD = config.getString("pwd");

        dataSource = setupDataSource();
    }

    public static Connection getOracleConnection() throws SQLException {
        return dataSource.getConnection();
    }

    private static DataSource setupDataSource() {
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        try {
            cpds.setDriverClass(DRIVER_NAME);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        cpds.setJdbcUrl(URL);
        cpds.setUser(UNAME);
        cpds.setPassword(PWD);
        cpds.setMinPoolSize(5);
        cpds.setAcquireIncrement(5);
        cpds.setMaxPoolSize(20);
        return cpds;
    }
}

DAO では、次のように記述します。

try {
            conn = DBConnection.getOracleConnection();

            ....


} finally {
    try {
        if (rs != null) {
            rs.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (conn != null) {
            conn.close();
        }
    } catch (SQLException e) {
        logger
                .logError("Exception occured while closing cursors!", e);

    }

さて、私の質問は、finally ブロックにリストされているカーソル (connection/statement/resultSet/preparedStatement) を閉じる以外に、他のクリーンアップを行う必要があるかどうかです。

この掃除は何ですか??いつ、どこでこれを行う必要がありますか?

上記のコードに何か問題がある場合は、指摘してください。

4

4 に答える 4

26

プールされたデータ ソースでは、プール内の接続は実際には閉じられず、プールに返されるだけです。ただし、アプリケーションがシャットダウンされると、データベースへのこれらの接続は適切かつ実際に閉じられる必要があり、最終的なクリーンアップが必要になります。

ちなみに、c3p0 プロジェクトはほとんど死んでいます。代わりにApache Commons DBCPを使用することをお勧めします。これはまだ維持されています。

于 2009-09-22T08:01:18.783 に答える
6

DAOは、データベースへの接続を取得する責任を負わないようにする必要があります。大規模なトランザクションの一部としていつ使用されているかを知る方法はありません。データソースまたは接続インスタンスをDAOに渡す必要があります。

finallyブロックで閉じる呼び出しのいずれかが例外をスローした場合、後続の呼び出しはいずれも呼び出されません。それぞれが独自のtry/catchブロックにある必要があります。私はそれらを静的メソッドとしてユーティリティクラスに入れました。

于 2009-09-22T09:53:48.323 に答える
5

コードは私には問題ないように見えますが、閉じる操作を行うヘルパー メソッドを作成するか、すべての DAO またはメソッドでこの詳細な最終ブロックを取得します。ステートメントと結果セットが実行をスローしたかどうかに関係なく、接続が確実に閉じられるように、閉じる操作の周りに 3 つの個別の try-catch-blocks を記述する必要があります。また、 javadocが言うことに注意してください

Statement オブジェクトが閉じられると、現在の ResultSet オブジェクトが存在する場合は、それも閉じられます。

したがって、上記の例で結果セットを閉じる必要はありませんが、閉じることはできます。

リンクされたクリーンアップ メソッドは、データソースを閉じるためのものです。DS はアプリが実行されている限り存続するため、ほとんどのプロジェクトでは必要ありません。

于 2009-09-22T08:03:37.560 に答える