私の理解では、MySQL 5.1 はサーバー側のプリペアド ステートメントをサポートしています。したがって、次のコードはステートメントを 1 回準備し、10 回実行する必要があります。
Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT COUNT(*) FROM users WHERE user_id=?");
for (int i=0; i<10; i++)
{
stmt.setString(1, "FOO"+i);
ResultSet res = stmt.executeQuery();
res.close();
}
stmt.close();
conn.close();
代わりに mysqld ログに表示されるのは、クエリが直接実行されていることです。
SELECT @@session.tx_isolation
SELECT USER()
SELECT COUNT(*) FROM users WHERE user_id='FOO0'
SELECT COUNT(*) FROM users WHERE user_id='FOO1'
SELECT COUNT(*) FROM users WHERE user_id='FOO2'
...
プロトコルログにも毎回完全に送信されたクエリが表示されます(tcpdumpを使用)。
Connector/J 5.1.12 および MySQL 5.1.44 を使用。JDBC URL に面白い JDBC オプションはありません。このテストのドライバーに直接行くと、プールはありません。
なぜ声明は準備されていないのですか?