プリペアド ステートメントをキャッシュする MySQL の機能を利用するにはどうすればよいですか? 準備済みステートメントを使用する理由の 1 つは、同じ準備済みステートメントを再度使用する場合に、準備済みステートメント自体を複数回送信する必要がないことです。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb" +
"?cachePrepStmts=true", "user", "pass");
for (int i = 0; i < 5; i++) {
PreparedStatement ps = conn.prepareStatement("select * from MYTABLE where id=?");
ps.setInt(1, 1);
ps.execute();
}
conn.close()
上記の Java の例を実行すると、mysqld ログ ファイルに 5 組の Prepare コマンドと Execute コマンドが表示されます。ps 割り当てをループの外に移動すると、もちろん、1 つの Prepare コマンドと 5 つの Execute コマンドになります。接続パラメータ「cachePrepStmts=true」は、ここでは何の違いもないようです。
Spring と Hibernate を使用して同様のプログラムを実行する場合、送信される Prepare コマンドの数 (1 または 5) は、cachePrepStmts 接続パラメーターが有効になっているかどうかによって異なります。Hibernate は、cachePrepStmts 設定を利用するために準備済みステートメントをどのように実行しますか? 純粋な JDBC を使用してこれを模倣することは可能ですか?
これをMySQL Server 4.1.22およびmysql-connector-java-5.0.4.jarで実行していました