3

据我了解,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)。

使用连接器/J 5.1.12 和 MySQL 5.1.44。JDBC URL 中没有有趣的 JDBC 选项。直接去找司机做这个测试,没有游泳池。

为什么不准备声明?

4

1 回答 1

8

除非您使用连接参数打开真正的服务器端语句,否则 Connector/J 驱动程序会在本地处理准备好的语句useServerPrepStmts=true

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

于 2010-10-15T23:13:37.867 回答