Как воспользоваться возможностью MySQL для кэширования подготовленных операторов?
Одна из причин использовать подготовленные операторы заключается в том, что нет необходимости отправлять подготовленный оператор несколько раз, если один и тот же подготовленный оператор будет использоваться снова.
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 я вижу 5 пар команд Prepare и Execute в файле журнала mysqld. Перемещение назначения ps за пределы цикла приводит к разовым командам 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