Ошибка 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.