Che*_*hei 8 java mysql hibernate jdbc prepared-statement
我如何利用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()
Run Code Online (Sandbox Code Playgroud)
运行上面的Java示例时,我在mysqld日志文件中看到了5对Prepare和Execute命令.将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上运行它
是否可以使用纯 JDBC 来模拟这个?
这实际上不是您通过将准备好的语句调用移出循环所做的事情吗?
我可能误解了 MySQL 缓存的工作方式,但是日志文件是否一定会报告缓存的工作情况?Spring 或 Hibernate 可能有自己的中间缓存,用于根据之前发送的语句检查准备好的语句。当您使用 Spring 运行该程序时,您可能会看到这样的情况。这意味着对您的系统进行一些跟踪,看看 mysqld 日志是否只是报告它所发送的语句,无论它如何处理它们。