3

私の理解では、MySQL 5.1 はサーバー側のプリペアド ステートメントをサポートしています。したがって、次のコードはステートメントを 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 オプションはありません。このテストのドライバーに直接行くと、プールはありません。

なぜ声明は準備されていないのですか?

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 に答える