プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

PreparedStatementはただのStatementより速くなるのか?

 PreparedStatementを使うと、事前にSQLコンパイルされて速くなるという。大体どのサイトも本もそんなことが書いてある。しかしWebアプリケーションでは、毎回DataSource → Connection → Statementというように取得する。Connectionはプールしておくとして、毎回Connection#prepareStatement()でPreparedStatementを生成して本当にただのStatementより速くなるのだろうか?
 これに対する疑問はhttp://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.htmlにあった。これがPreparedStatementの動作だ。予想通り、毎回Connection#prepareStatement()を呼び出すとSQLのパーズも毎回起こり、SQLの事前コンパイルの利点が行かされていないことが分かった。なんかAPサーバー側でPreparedStatementをキャッシュする設定にすれば速くなるとあるが、つまりJava言語レベルでは不可能ってことなのね。ConnectionだけでなくPreparedStatementもソフトウェア側でキャッシュするようにしといたほうがいいのだろうか。