1

javase データベース アプリケーションでは、多くの短命のオブジェクト (請求書などの会計文書など) を処理します。
各オブジェクトの処理は、データベースへの接続を開き、データを検索することから成ります。すべてのオブジェクトが同じデータベースで検索されるわけではありませんが、いくつかのオブジェクト プロパティに従って特定のデータベースを選択するため、複数の接続が開かれることになります。
私が実際に必要としているのは、データベースごとに 1 つだけの接続です。
だから私はこのようなことをしました:

public MyPool {

    Map<String, Connection> activeConnections = new TreeMap<String, Connection>();

    public Connection getConnection(String database_name) throws SQLException {

    if (activeConnections.containsKey(database_name)) {
        return activeConnections.get(database_name);
    }

    //Retrive the configuration data from a configuration object
    ConnectionConfig c = Configuration.getConnectionConfig(database_name);

    Connection connection = DriverManager.getConnection(c.url, c.user, c.password);

    return connection;

}

質問は次のとおりです:
1) 多くのプーリング ライブラリ、DBCP、c3p0 などを見ているので、これらすべてのライブラリのポイントは何ですか?このような「基本的な」アプローチに何を追加しますか? ここで公開されている基本的なソリューションは、接続プーリングの定義に完全に適合するため、この
ようなチュートリアルはこの質問に答えるのにあまり役に立ちません。

2) これは、他の開発者に「公開」されるコードの一部であり、異なる構造を持つデータベースからデータを取得する手順を開発し、おそらくこの「プール オブジェクト」から接続を取得する可能性があります。
ドキュメントとコードでそれを「プール」と呼んでいるのは正しいですか、それとも何か違うので、「プール」を呼び出すと誤解を招く可能性がありますか?

4

2 に答える 2

2

各データソースには単一の物理接続しかないため、コードはこの用語の口語的な使用における接続プールの実装ではありません。オブジェクト プーリング (この場合、オブジェクトは接続) の背後にある概念は、一部のオブジェクトでは構成にオーバーヘッドが必要であるということです。接続プールの場合は、ご存じのとおり、データベースと対話する前にデータベース接続を開く必要があります。

ここでの違いは、あなたが言及した一般的な接続プールの実装のような並行環境に対してコードがスレッドセーフではないことです。Web のような同時実行性の高い環境で実行されるアプリケーションは、要求ごとに接続を確立するオーバーヘッドを吸収する必要はありません。代わりに、開いている接続のプールが維持され、リクエストが接続での作業を完了すると、後続のリクエストが利用できるようにプールに返されます。

接続はステートフルであるため、これは必須です。複数のリクエストで同時に同じ接続を共有することはできず、合理的なトランザクション セマンティクスを保証することはできません。

于 2012-08-14T15:21:19.567 に答える