- - PR -
PreparedStatementのキャッシュ保持について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-07-17 23:24
JDBCでRDBMSを操作する際にPreparedStatementを使うと
効果的だと言われています。そこで疑問に思ったのですが、 PreparedStatementによりプリコンパイルされたSQLは コネクションをクローズした後もキャッシュされているのでしょうか? 通常SQLを発行した後、必要が無くなった段階でコネクションをクローズ もしくは返却すると思いますが、再度Connection#prepareStatementメソッド を読んだ際にも、新たにプリコンパイルせずに再利用してくれるのでしょうか? ネットや書籍で調べてみたのですが、これと言った答えを見つけることは 出来ませんでした。 | ||||
|
投稿日時: 2003-07-18 09:33
@IT総合検索から「PreparedStatement」で検索したところ
このような記事がありました。 http://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.html 要約すると SQL文は同じものが使用されるためデータベース側のキャッシュには ヒットしやすいがそれほど大きな効果は得られない らしいです。 | ||||
|
投稿日時: 2003-07-18 09:35
R-55です。
すいません、質問の答えになってませんでした。 記事から推測するにおそらく新たにプリコンパイルしているのだと思います。 | ||||
|
投稿日時: 2003-07-18 10:23
やはりそうなのですか・・・。
そうすると利用価値があまり無さそうな気がしますね。 例えばServletの場合だと、一度のリクエスト中にWhere句を変えながら ループを回していくようなケースは稀で、Where句が変わるというのは 画面から検索条件が変更されて再度リクエストを受け付けたときになります。 その場合は、再び同じ検索メソッドが実行されると思うので、毎回 prepareStatementメソッドが実行されてむしろ効率が悪いという結論に なってしまいます。どっちかというとパラメータを変えながらInsertを 繰り返し実行するときに使うのかな? 他に有効なコメントが無ければPreparedStatementを乱用するの 控えようかと思います。 ありがとうございました。 | ||||
|
投稿日時: 2003-07-18 11:12
JDBCドライバやRDBMSの実装依存では無いでしょうか?
一概に“あまり有効で無い”と考えず、 JDBCドライバをリリースしているメーカ辺りに 問い合わせた方が宜しいかと思います。 | ||||
|
投稿日時: 2003-07-18 12:49
よくないのかもしれませんが、自分はとりあえずつかっとけー感じで使ってます(笑)
通常のstatementと比べてデメリットが特に感じられないからです。 あとはoracleでしたらライブラリキャッシュのチューニングなど、 DB側のチューニングをちゃんとやっておけばよいとおもうのですが。 どうでしょうか。。あまり参考にならない意見ですいません。^^;; | ||||
|
投稿日時: 2003-07-18 13:10
御爺庵さん、Clapさん
そうですね。PostgreSQLのソースを追いかけてみると、 結局はRDBMS側の実装依存かなあと思いました。 Javaの方でSQLをシリアライズなんてしないだろうし・・・。 あまり詳しくないのと、DB担当ではないのでとりあえず、 パラメータを引数で渡すようなものに関してはPreparedStatementを 使っておきます。パフォーマンスの問題が出たときにまた調べてもらおうと 思います。 以上、ちなみにDBMSはOracle9iです。 どうもありがとうございました。 | ||||
|
投稿日時: 2003-07-18 23:21
>他に有効なコメントが無ければPreparedStatementを乱用するの
>控えようかと思います。 Stringの'をエスケープしなくていいとか、醜いSQL文の連結をしなくていいとか 良いことだらけのような気がします。 どんどん濫用すべきでしょう。 PrepareStatementの方が10倍遅いとかなら考えますが、 普通は(Prepared/Statementの差より)DBアクセス自身の方がずっと遅いですよね? |