数据库
首页 > 数据库> > 没有使用MySQL Connector / J的服务器端预处理语句

没有使用MySQL Connector / J的服务器端预处理语句

作者:互联网

据我所知,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).

使用Connector / J 5.1.12和MySQL 5.1.44. JDBC URL中没有有趣的JDBC选项.直接去驾驶员进行这项测试,没有游泳池.

为什么不准备这些陈述?

解决方法:

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

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

标签:mysql-connector,mysql,jdbc,prepared-statement
来源: https://codeday.me/bug/20190726/1545158.html