Làm cách nào để tận dụng khả năng của MySQL để lưu trữ các câu lệnh đã chuẩn bị? Một lý do để sử dụng các câu lệnh đã chuẩn bị là không cần phải gửi chính câu lệnh đã chuẩn bị nhiều lần nếu câu lệnh được chuẩn bị tương tự sẽ được sử dụng lại.Làm thế nào để sử dụng MySQL chuẩn bị báo cáo bộ nhớ đệm?
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()
Khi chạy ví dụ Java ở trên, tôi thấy 5 cặp Chuẩn bị và Thực thi lệnh trong tệp nhật ký mysqld. Việc chuyển bài tập ps ra ngoài vòng lặp dẫn đến một lệnh Chuẩn bị và Thực thi 5 tất nhiên. Tham số kết nối "cachePrepStmts = true" dường như không tạo ra bất kỳ sự khác biệt nào ở đây.
Khi chạy một chương trình tương tự bằng cách sử dụng Spring và Hibernate số lượng lệnh Chuẩn bị gửi (1 hoặc 5) phụ thuộc vào việc tham số kết nối cachePrepStmts có được bật hay không. Làm thế nào để Hibernate thực thi các câu lệnh đã chuẩn bị để tận dụng lợi thế của thiết lập cachePrepStmts? Có thể bắt chước điều này bằng JDBC thuần túy không?
Tôi đã chạy trên MySQL Server 4.1.22 và mysql-connector-java-5.0.4.jar