Ошибка max_prepared_stmt_count, как утилизировать подготовленные операторы?

Я получаю ошибку ниже от MySQL:

Can\'t create more than max_prepared_stmt_count statements (current value: 16382)

Я увеличил значение до максимума (1 миллион) на данный момент.

я использую node-mysql2 но я думаю, что независимо от того, что мой счет подготовленных заявлений в конечном итоге достигнет 1M.

Итак, мой вопрос заключается в том, как я должен должным образом переработать эти заявления, чтобы они не превышали 1 млн каждые несколько недель?

Кроме того, как я могу очистить этот кэш, если я достигну отметки 1М?

Мой код узла /mysql2 выглядит следующим образом:

import mysql from 'mysql2/promise'
const pool = mysql.createPool({ host, port, connectionLimit: 100 })
export default pool

Затем я использую пул везде с подготовленными утверждениями а-ля:

pool.execute('SELECT * FROM ... etc etc')

Я предполагаю, что удержание 100 соединений и их повторное использование приводит к тому, что подготовленные операторы в конечном итоге достигают максимума. Я вижу недокументированную особенность в node/mysql2, которая говорит maxPreparedStatements что я могу добавить в конфиг. Поможет ли это предотвратить проблему в будущем? Или мне все равно придется время от времени "очищать подготовленные операторы" в mysql (если это так, какова команда для его очистки)?

Обратите внимание, у меня есть 3 сервера реплики, которые подключаются к MySQL

0 ответов

Надеюсь, вы уже нашли ответ.

Я не вижу этого с подготовленным оператором, хотя я видел это, когда использовал запросы, которые различаются каждый раз, когда изменяется один параметр (создание строки запроса sql в JS...).

Вы уверены, что используете заранее подготовленные операторы?

Ваши запросы должны выглядеть так:

pool.execute('SELECT * FROM ... where id = ? etc etc', [id, ...])

Я тестирую https://www.npmjs.com/package/mysql2 v2.2.5.

Делайте все свои запросы таким образом. Возможно, активируйте журнал mysql на сервере разработки, чтобы проверить выполняемые запросы.

Хорошие отладочные запросы mysql, которые нужно выполнять в mysql cli:

show variables where `variable_name` like  '%stmt%';
show status where `variable_name` like  '%stmt%';

Важными значениями являются статус Prepared_stmt_count и конфигурация max_prepared_stmt_count.

Другие вопросы по тегам