Насколько я понимаю, MySQL 5.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. Идя прямо к водителю для этого теста, без пула.
Почему не готовятся заявления?