2009-06-03 10 views
3

サーブレット環境(特にTomcat 5.5)でプリペアドステートメントをキャッシュする方法を探しています。これは、準備されたステートメントが作成される回数、すなわちconnection.prepareStatement(sql)が呼び出される回数を減らすことを意味する。Tomcatでプリペアドステートメントをキャッシュするための良い戦略は何ですか?

私の最初のアイデアは、キー(属性名)がクエリそのものである、セッションにPreparedStatementオブジェクトを格納することでした。これは遅れて行うこともできます。

しかし、JDBCドライバの実装によっては、2つのスレッド(または要求)によって同じ準備済みの文に同時にアクセスすることができ、誤ったパラメータが設定されているなどの警告を受けました。したがって、これらのステートメント・オブジェクトへのアクセスは同期化する必要があります。

これを達成するにはどうすればよいでしょうか?

これを行うためにtomcatに組み込まれているメソッドはありますか?私はpoolPreparedStatements DBCPパラメータを記載しているthis answerを見ていますが、私が探しているのと同じ意味を持っているかどうかはドキュメントから完全には分かりません。

答えて

6

PreparedStatementキャッシュは、通常、使用している接続プールによって提供されます。 c3p0

お知らせを設定することによって行われますいくつかのSQLクエリに使用し、プールに返します。それだけで、その接続は別のスレッドが利用できるようになります。接続プールにバグが存在しない限り、接続はスレッド間で共有されません

私はDBCPではなくc3p0を使用することをお勧めします。 DBCPに関する多くの問題がありましたが、これはc3p0に移行すると解決されました。

0

私は他のDBについてはわかりませんが、Oracleを使用している場合、JDBCクライアントはPreparedStatementをキャッシュします。あなたのDBがそれをするかどうかを知りたいかもしれません。

関連する問題