15

たとえば、preparedStatement キャッシュ用に定義された「maxStatements」を使用して c3p0 を使用しています。このキャッシングは実際に何をしますか? キャッシュするデータの種類。どのレベル(データベース、アプリケーション、..)ですか?例から理解できるとよいでしょう。たとえば、クエリがあります

select * from sometable where somecolumn=?

今、キャッシュされていない準備済みステートメントで送信します。そして今、私はそれを送信しており、キャッシュされています。違いはなんですか。最初のケースと 2 番目のケースで何が起こったのか。最初のケースと 2 番目のケースで DB サーバーに送信されるものは何ですか?

ありがとう。

4

2 に答える 2

16

キャッシュを使用しない場合、Connectionからリクエストするたびに新しいPreparedStatementを取得します。キャッシングでは、同じSQL文字列を指定すると、PreparedStatement型のまったく同じJavaオブジェクトを取得することがよくあります。同じSQLをPreparedStatementに提供すると、パラメーターが異なっていても、同じPreparedStatementを引き続き使用する場合に限り、データベースは実行プランなどの情報を再利用できることがよくあります。キャッシングは、アプリがそのPreparedStatement参照自体を保持する必要がないため、これを簡単にします。

于 2012-08-27T11:42:22.930 に答える
11

ジョン・ワッツの答えはとても良いです。

ステートメントキャッシングは透過的であるため、提供できるサンプルコードがないことに注意してください。それを使用するコードは、そうでないコードとまったく同じように見えます。maxStatementsまたはmaxStatementsPerConnectionを正の値に設定することにより、c3p0でステートメントキャッシュをオンにするだけです。

ステートメントキャッシングによるパフォーマンス上の利点は、データベース/JDBCドライバーに依存します。ステートメントキャッシングが役立つかどうかを確認するには、最初にステートメントキャッシングをオフにして、次にmaxStatementsPerConnectionをアプリが繰り返し使用するプリペアドステートメントクエリの数に設定して、アプリのプロファイルを作成してみてください。一部のアプリ/データベース/ドライバーでは、大きなメリットがあります。他の人にとっては、重要なメリットはありません。

于 2012-08-27T12:06:44.017 に答える