Нет подготовленных операторов на стороне сервера с использованием MySQL Connector / J - PullRequest
3 голосов
/ 16 октября 2010

Насколько я понимаю, 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. Идя прямо к водителю для этого теста, без пула.

Почему не готовятся заявления?

1 Ответ

8 голосов
/ 16 октября 2010

Драйвер Connector / J обрабатывает подготовленные операторы локально, если вы не включите операторы реального сервера, используя параметр соединения useServerPrepStmts=true.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...