2009-07-25 14 views
5

アーキテクチャ上、複数のスレッドでJDBCを処理する最良の方法は何ですか?データベースに同時にアクセスするスレッドが多数あります。単一の接続とステートメントで、次のエラーメッセージが表示されます。マルチスレッドJDBC

org.postgresql.util.PSQLException:このResultSetが閉じています。

複数の接続、複数の文を使用するか、より良い方法がありますか?私の予備的な考えは、スレッドごとに1つのステートメントを使用し、ステートメントごとに1つの結果セットを保証することでした。

答えて

4

タスクごとに1つの接続を使用する必要があります。接続プーリングを使用する場合は、他の接続によって準備されたプリペアドステートメントを使用することはできません。接続によって作成されたすべてのオブジェクト(ResultSet、PreparedStatements)は、接続がプールに返された後で使用するために無効です。

だから、それはすべてあなたのDAOオブジェクトが接続していない取り、この場合には

public void getSomeData() { 
    Connection conn = datasource.getConnection(); 
    PreparedStatement st; 
    try { 
    st = conn.prepareStatement(...); 
    st.execute(); 
    } finally { 
    close(st); 
    close(conn); 
    } 
} 

ので似ていますが、実際にプール可能な接続工場ですDataSourceオブジェクト(は、java.sql.DataSource)。そして、それぞれの方法で最初にすべての接続を取得し、すべての作業を行い、接続を閉じます。できるだけ早くプールに接続してください。接続が返された後、物理的に閉じられないかもしれないが、再初期化される(すべてのアクティブなトランザクションが閉じられ、すべてのセッション変数が破棄されるなど)

1

はい、接続プールで複数の接続を使用します。あなたが必要なことをするのに十分な時間だけ接続を開いて、完了したらすぐに閉じてください。接続プールが効率のために「物理的な」接続管理を担当するようにします。