- PR -

PreparedStatementのキャッシュ保持について

投稿者投稿内容
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2003-07-17 23:24
JDBCでRDBMSを操作する際にPreparedStatementを使うと
効果的だと言われています。そこで疑問に思ったのですが、
PreparedStatementによりプリコンパイルされたSQLは
コネクションをクローズした後もキャッシュされているのでしょうか?
通常SQLを発行した後、必要が無くなった段階でコネクションをクローズ
もしくは返却すると思いますが、再度Connection#prepareStatementメソッド
を読んだ際にも、新たにプリコンパイルせずに再利用してくれるのでしょうか?

ネットや書籍で調べてみたのですが、これと言った答えを見つけることは
出来ませんでした。
R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 2003-07-18 09:33
@IT総合検索から「PreparedStatement」で検索したところ
このような記事がありました。

http://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.html

要約すると
SQL文は同じものが使用されるためデータベース側のキャッシュには
ヒットしやすいがそれほど大きな効果は得られない

らしいです。
R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 2003-07-18 09:35
R-55です。

すいません、質問の答えになってませんでした。
記事から推測するにおそらく新たにプリコンパイルしているのだと思います。
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2003-07-18 10:23
やはりそうなのですか・・・。
そうすると利用価値があまり無さそうな気がしますね。
例えばServletの場合だと、一度のリクエスト中にWhere句を変えながら
ループを回していくようなケースは稀で、Where句が変わるというのは
画面から検索条件が変更されて再度リクエストを受け付けたときになります。
その場合は、再び同じ検索メソッドが実行されると思うので、毎回
prepareStatementメソッドが実行されてむしろ効率が悪いという結論に
なってしまいます。どっちかというとパラメータを変えながらInsertを
繰り返し実行するときに使うのかな?

他に有効なコメントが無ければPreparedStatementを乱用するの
控えようかと思います。

ありがとうございました。
御爺庵
常連さん
会議室デビュー日: 2002/02/06
投稿数: 33
お住まい・勤務地: 大阪府
投稿日時: 2003-07-18 11:12
JDBCドライバやRDBMSの実装依存では無いでしょうか?

一概に“あまり有効で無い”と考えず、
JDBCドライバをリリースしているメーカ辺りに
問い合わせた方が宜しいかと思います。
Clap
常連さん
会議室デビュー日: 2003/02/14
投稿数: 20
投稿日時: 2003-07-18 12:49
よくないのかもしれませんが、自分はとりあえずつかっとけー感じで使ってます(笑)
通常のstatementと比べてデメリットが特に感じられないからです。
あとはoracleでしたらライブラリキャッシュのチューニングなど、
DB側のチューニングをちゃんとやっておけばよいとおもうのですが。
どうでしょうか。。あまり参考にならない意見ですいません。^^;;
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2003-07-18 13:10
御爺庵さん、Clapさん

引用:

御爺庵さんの書き込み (2003-07-18 11:12) より:
JDBCドライバやRDBMSの実装依存では無いでしょうか?

一概に“あまり有効で無い”と考えず、
JDBCドライバをリリースしているメーカ辺りに
問い合わせた方が宜しいかと思います。



そうですね。PostgreSQLのソースを追いかけてみると、
結局はRDBMS側の実装依存かなあと思いました。
Javaの方でSQLをシリアライズなんてしないだろうし・・・。
あまり詳しくないのと、DB担当ではないのでとりあえず、
パラメータを引数で渡すようなものに関してはPreparedStatementを
使っておきます。パフォーマンスの問題が出たときにまた調べてもらおうと
思います。

以上、ちなみにDBMSはOracle9iです。

どうもありがとうございました。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2003-07-18 23:21
>他に有効なコメントが無ければPreparedStatementを乱用するの
>控えようかと思います。

Stringの'をエスケープしなくていいとか、醜いSQL文の連結をしなくていいとか
良いことだらけのような気がします。
どんどん濫用すべきでしょう。

PrepareStatementの方が10倍遅いとかなら考えますが、
普通は(Prepared/Statementの差より)DBアクセス自身の方がずっと遅いですよね?

スキルアップ/キャリアアップ(JOB@IT)