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

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

Похожие вопросы