1

CallableStatementのインスタンスを再利用することは、一般的に良い方法と考えられています (ここを確認してください)。

しかし、 を作成するときCallableStatement、そのステートメントは (私の理解では) 特定の にバインドされConnectionます。したがって、通常は次のようにします。

Connection con = pool.getConnection();
CallableStatement st = con.prepareCall("{ some stmt; }");
st.executeQuery();
st.close();
con.close();            

私が確認したところ、次のクエリは実行されません。

Connection con = pool.getConnection();
CallableStatement st = con.prepareCall("{ some stmt; }");
con.close();
con = pool.getConnection(); // possibly another new connection, different than the one used to create the CallableStatement instance
st.executeQuery();
st.close();

私の質問は、すべてのCallableStatementインスタンスを再利用したいが、一方で新しい接続を取得して古い接続を閉じることができる場合 (常に同じ接続を開いているとは限らない)、どうすればよいですか?

4

1 に答える 1

2

PreparedStatements は JDBC ドライバーによってキャッシュされます (またはキャッシュされるべきです)。たとえば、http ://www.mchange.com/projects/c3p0/ を参照してください。

これは、1 つを保持して接続間で使用するべきではないことを意味しますが、心配する必要はありません。ドライバーがキャッシュを管理します。基本的に、各接続が独自にキャッシュするため、接続が 5 つある場合は、キャッシュされたコピーが 5 つ存在することになりますが、これはおそらく十分に小さいものです。

呼び出しprepareStatementは、キャッシュされている場合はキャッシュから取得し、そうでない場合は割り当てます。したがって、 への繰り返し呼び出しprepareStatementは軽量です。これが API の正しい使い方です。

たとえば、技術的に Oracle 固有の Oracle のドキュメントを参照してください。ただし、この情報は標準的なものだと思います。

于 2013-10-07T00:28:54.580 に答える