2010-10-15 54 views
3

据我所知,MySQL 5.1支持服务器端准备语句。因此,下面的代码应该准备语句一次,并且执行10次:没有服务器端准备好的语句使用MySQL连接器/ J

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选项。直接去这个测试的驱动程序,没有游泳池。

为什么不准备报表?

回答

8

Connector/J驱动程序在本地处理预处理语句,除非您使用连接参数useServerPrepStmts=true打开真实的服务器端语句。

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

+1

我不知道这是否已经从那以后固定的(阅读更新日志是不是我的好时机想法),但也有与服务器端预处理语句一堆的问题,所以他们在Connector/J中是默认禁用的(http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-0-5.html)。 – 2014-02-13 17:04:45