Я запускаю проект Django с Peewee в Python 3.6 и пытаюсь выяснить, что не так с пулом соединений.Я продолжаю получать следующую ошибку на сервере разработки (по какой-то причине у меня никогда не возникало этой проблемы на моем локальном компьютере):
Потерянное соединение с сервером MySQL во время запроса
Действия по воспроизведению надежны:
- Перезапустите Apache на экземпляре.
- Перейдите на мою страницу Django и нажмите кнопку, которая запускает операцию БД.
- Работает нормально.
- Подождите ровно 10 минут (я проверил достаточно, чтобы получить точное число).
- Нажмите другую кнопку, чтобы запустить другую операцию БД.
- Получить потерянныйошибка соединения выше.
Код структурирован таким образом, что у меня есть все операции с БД внутри независимого модуля Python, который импортируется в модуль Django.
В конструкторе основного класса IЯ настраиваю БД следующим образом:
from playhouse.pool import PooledMySQLDatabase
def __init__(self, host, database, user, password, stale_timeout=300):
self.mysql_db = PooledMySQLDatabase(host=host, database=database, user=user, password=password, stale_timeout=stale_timeout)
db_proxy.initialize(self.mysql_db)
Каждый вызов, который должен вызывать БД, выполняется следующим образом:
def get_user_by_id(self, user_id):
db_proxy.connect(reuse_if_open=True)
user = (User.get(User.user_id == user_id))
db_proxy.close()
return {'id': user.user_id, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email }
Я смотрел на wait_timeout
значение на экземпляре MySQLd его значение равно 3600, так что, похоже, это не проблема (и я все равно пытался изменить его, просто чтобы посмотреть).
Есть идеи, что я мог бы сделать не так?
Обновление:
Я обнаружил, что в файле конфигурации /etc/my.cnf
для MySQL значение wait-timeout
установлено равным 600, что соответствует тому, что я испытываю.Я не знаю, почему это значение не отображается, когда я запускаю SHOW VARIABLES LIKE 'wait_timeout';
на БД MySQL (который возвращает 3600), но, похоже, проблема возникает из-за тайм-аута ожидания.
Учитывая это, япопытался установить устаревшее время ожидания 60, предполагая, что если оно меньше, чем время ожидания, это может решить проблему, но это не имеет значения.