@kkolorid

Почему телеграм бот отключается от БД после ночного простоя?

Почему-то тг бот с AIOGRAM на утро начинает давать ошибку после ночного простоя. Подключение к БД не пересоздается, видимо. Как лучше реализовать это в моем случае? Использую драйвер MYSQL ODBC и создаю экземпляр класса с подключением к БД при запуске бота. Код типичной ошибки при первой попытке воспользоваться ботом на утро:
File "/root/tg_bot/bot.py", line 118, in process_callback
    config = db.select("SELECT * FROM `config`")
  File "/root/tg_bot/db.py", line 23, in select
    self.cursor.execute(query, args)
pyodbc.OperationalError: ('08S01', '[08S01] [MySQL][ODBC 8.0(w) Driver][mysqld-8.0.31]Lost connection to MySQL server during query (2013) (SQLExecDirectW)')


Класс вот так реализован:
class Db:
    def __init__(self):
        self.conn = mysql.connector.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD)
        if self.conn.is_connected():
            self.cursor = self.conn.cursor(buffered=True)

    def selectRow(self, query, args = None):
        self.cursor = self.conn.cursor(buffered=True)
        self.cursor.execute(query, args)
        return self.cursor

    def insertRow(self, query, args = None):
        self.conn = mysql.connector.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD)
        if self.conn.is_connected():
            self.cursor = self.conn.cursor()
        self.cursor.execute(query, args)
        self.conn.commit()

    def updateRow(self, query, args = None):
        self.conn = mysql.connector.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD)
        if self.conn.is_connected():
            self.cursor = self.conn.cursor()
        self.cursor.execute(query, args)
        self.conn.commit()

    def reload(self):
        self.cursor = self.conn.cursor(buffered=True)


Раньше пользовался библиотекой mysql_connector без драйверов и тд. Всё хорошо работало.
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега AIOHTTP
Седой и строгий
Во-первых, курсор в принципе не стоит переиспользовать. Во-вторых, соединения не вечны и не стабильны.
Ответ написан
@Vitsliputsli
Так как соединение долго не использовалось, MySQL тупо его оборвал.
Используйте для бота systemd unit с перезапуском при ошибке, ошибки бывают разные, пускай перезапускается автоматически. Хоть это и решит проблему, лучше все-таки разрывать соединение, если оно долго не используется. Или, на худой конец восстанавливать его при обрыве.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы