Вновь открыть подключение к 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 шт):
Вам необходимо закрыть соединение перед ресурсоемкой операцией, и открыть его снова когда оно понадобится.
Ваше непонимание в необходимости постоянного открытия/закрытие сессий видимо связано с тем, что вы работали с PHP/Python в режиме CGI. В этом случае, пользователь заправшивает страницу, код запускается, и как только страница отрисована, сессия убивается уборщиком мусора.
В "режиме демона"(точнее в обычном режиме работы) в любых языках вы должны управлять сессиями.
В простом случае, сборщик мусора python вызывает деструктор класса, в вашем случаем pymysql, закрывая сессию сразу же, как вы перестаёте обращаться к переменной её содержащую. В иных случаях, вы должны сами контролировать, вызывается ли деструктор, иначе это приведёт к большому количеству пустых сессий в бд.
Это может случиться, когда сборщик не может корректно отработать, в результате краша, или при удержании соединения в бесконечном цикле.
Так же, нет гарантий, что библиотека, которую вы используете для работы с бд реализует этот деструктор, перед работой(или при обнаружении утечек) вы должны или убедиться в его существовании, или закрывать сессию каждый раз, как это делают некоторые "сеньоры", просто придерживаясь правил "Best practices"