Вновь открыть подключение к mysql

class DB:
    def __init__(self):
        self.conn =  pymysql.connect(host='localhost', user='user', passwd='123', db='table', charset='utf8', cursorclass=pymysql.cursors.DictCursor)
        self.cursor = self.conn.cursor()

    def query(self, ql):
        self.cursor.execute(ql)
        return self.cursor.fetchall()

    def super_query(self, ql):
        self.cursor.execute(ql)
        return self.cursor.fetchone()

    def update(self, ql):
        self.cursor.execute(ql)
        self.conn.commit()

    def close(self):
        self.conn.close()

Написал простенький код для работы с бд из пайтона. Трудность в том, перед тем как начать преобразовывать видео, открываю соединение, далее преобразовываю видео. Продолжительность преобразования очень продолжительная. Из-за чего скорее всего теряется сессия подключения.

(2013, 'Lost connection to MySQL server during query')

Вопрос в том, как при вызове функции query либо какой другой. Проверить наличие подключения и в случаи отсутствия, вновь вызвать def __init__(self):. Чтобы открыть подключение и выполнить запрос. Я так думаю...

Быть может есть более практичный способ решения. Но увеличить таймаут сессии https://stackoverflow.com/questions/10563619/error-code-2013-lost-connection-to-mysql-server-during-query

В моем случаи, не столь верное...


Ответы (1 шт):

Автор решения: Rijen

Вам необходимо закрыть соединение перед ресурсоемкой операцией, и открыть его снова когда оно понадобится.

Ваше непонимание в необходимости постоянного открытия/закрытие сессий видимо связано с тем, что вы работали с PHP/Python в режиме CGI. В этом случае, пользователь заправшивает страницу, код запускается, и как только страница отрисована, сессия убивается уборщиком мусора.

В "режиме демона"(точнее в обычном режиме работы) в любых языках вы должны управлять сессиями.

В простом случае, сборщик мусора python вызывает деструктор класса, в вашем случаем pymysql, закрывая сессию сразу же, как вы перестаёте обращаться к переменной её содержащую. В иных случаях, вы должны сами контролировать, вызывается ли деструктор, иначе это приведёт к большому количеству пустых сессий в бд.

Это может случиться, когда сборщик не может корректно отработать, в результате краша, или при удержании соединения в бесконечном цикле.

Так же, нет гарантий, что библиотека, которую вы используете для работы с бд реализует этот деструктор, перед работой(или при обнаружении утечек) вы должны или убедиться в его существовании, или закрывать сессию каждый раз, как это делают некоторые "сеньоры", просто придерживаясь правил "Best practices"

→ Ссылка