3

デフォルトでマルチスレッド化されているサーブレットに関して、各サーブレットはデータベース接続をインスタンス化しますか、それとも接続はそのサーブレットのすべてのスレッド間で共有されますか?

サーブレットと Oracle データベース間のインターフェースとして JDBC を使用しています。

データベース接続がすべてのスレッド間で共有されている場合、データベースへの接続プールを使用する必要があるということですか?

/** Open the connection here **/
public void init() {
    String url = "server";
    String username = "pwd";
    String password = "usr";
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        conn = DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
        System.err.println("Error making pool: " + e);
        conn = null;
    }
}
4

2 に答える 2

4

データベース接続がすべてのスレッド間で共有されている場合、データベースへの接続プールを使用する必要があるということですか?

はい、間違いなく!JDBC 接続とシングルスレッドであり、スレッドセーフではありません。間に接続プールを導入し、最初に接続をフェッチして、同じリクエスト中にできるだけ早く閉じます。

于 2012-11-05T15:02:43.137 に答える
1

Connection の記述方法に応じて、サーブレットごと (インスタンス変数) またはグローバル (静的変数 - クラスター環境ではなく、深刻なボトルネックとなる並行性を管理している場合) にすることができます。

ただし、システムを効率的で、信頼性が高く、スケーラブルで、より簡単に管理できるようにし、リンク障害が発生した場合の再接続などのより高度な機能を実装する必要がないようにしたい場合 (バックエンドが Oracle であることを考えるとそうなると思います)アプリケーション サーバーの接続プーリング メカニズムを調べてください。

于 2012-11-05T15:00:46.583 に答える