没有使用 MySQL Connector/J 的服务器端准备语句

Posted

技术标签:

【中文标题】没有使用 MySQL Connector/J 的服务器端准备语句【英文标题】:No server-side prepared statements using MySQL Connector/J 【发布时间】:2011-04-26 03:45:59 【问题描述】:

据我了解,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 选项。直接去找司机做这个测试,没有游泳池。

为什么不准备语句?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我不确定从那以后这个问题是否已经修复(阅读变更日志不是我认为的好时机),但是服务器端准备好的语句存在很多问题,所以他们在 Connector/J (dev.mysql.com/doc/relnotes/connector-j/en/news-5-0-5.html) 中默认禁用。

以上是关于没有使用 MySQL Connector/J 的服务器端准备语句的主要内容,如果未能解决你的问题,请参考以下文章

如何使 MySQL Connector/J 在 android 上工作?

MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

我可以使用 MySQL Connector/J 执行多个用分号分隔的查询吗? [复制]

在 Windows 7 中设置路径 Connector/J