MySQL+Java でサーバサイドプリペアードステートメントを使うべきで「ない」理由

useServerPrepStmtsのここの説明ではデフォルトがtrueになっているが、これは上述の通り嘘である。 (中略) そしてなぜfalseにされたかということの背景を察すると、trueにすることの弊害もありそうで、手放しでこれをtrueにすることを勧めることが少しはばかられる。

http://www.geminium.com/chiba_blog/2008/12/23/33/

自分は Java 使ってないですが、MySQL の中の人が使うなって言ってます *1。その理由はメモリリークのような症状が出る可能性があるから

So why are prepared statements a problem?

Because users do not clean up/close unused prepared statements. Multiply the number of prepared statements times the number of open connections and you begin to see the problem.

What do you do about this?

Turn them off. The Java driver and a few other drivers turn them off automatically.

Prepared Statements, Musings - Brian "Krow" Aker's Idle Thoughts

おそらく、クライアント側の PreparedStatement オブジェクトを明示的に解放しないコードを書いている場合に、GC がそのオブジェクトを回収するまで、対応する mysqld 内のメモリが解放されない、ってのが問題なのかな。

パフォーマンスの観点から言っても MySQL のサーバーサイドプリペアードステートメントは実行プランのキャッシュがなかったりと、採るべき理由が少ないので、使うべき積極的な理由はないと思う *2

*1:Drizzle ではサーバサイドプリペアードは廃止

*2:バインディング文字コードSQL パーサの文字コードを揃えるのは当然として