2015-12-02 3 views
4

Я использую колбу и peewee. Иногда PeeWee бросает эту ошибкуСервер Peewee MySQL ушел

MySQL server has gone away (error(32, 'Broken pipe')) 

Peewee подключение к базе данных

db = PooledMySQLDatabase(database,**{ 
      "passwd": password, "user": user, 
      "max_connections":None,"stale_timeout":None, 
      "threadlocals" : True 
     }) 

@app.before_request 
def before_request(): 
    db.connect() 

@app.teardown_request 
def teardown_request(exception): 
    db.close() 

После ошибки тузд, что "сервер MySQL ушел (ошибка (32, 'Сломанная труба'))", выберите запросы работает без проблем , но вставка, обновление, удаление запросов не работают.

Вставить, обновить, удалить запросы работает (в mysql), но peewee выбросить эти ошибки.

(2006, "MySQL server has gone away (error(32, 'Broken pipe'))") 
+0

Пробовали ли вы его с ' stale_timeout' установлен? По умолчанию используется значение «300». –

+0

@KlausD. Я пробовал, но все равно имею ту же ошибку. Эта ситуация возникает, когда я закрываю и запускаю mysql во время работы колбы. Также, когда mysql выключается и перезапускается. – Alexander

+0

Это обычная проблема при использовании пулов соединений. Самый простой способ решить эту проблему - перезапустить сервер WSGI (или как вы запустите Flask) вместе с вашим сервером MySQL. Также вы должны перезапустить сервер MySQL редко, серверы баз данных созданы для запуска не для перезапуска. –

ответ

4

PeeWee документация говорил об этой проблеме, вот ссылка: Error 2006: MySQL server has gone away

Эта конкретная ошибка может произойти, когда MySQL убивает ожидания соединения с базой данных. Обычно это происходит с веб-приложениями, которые явно не управляют подключениями к базе данных. Что происходит при запуске вашего приложения, открывается соединение для обработки первого выполняемого запроса, и, поскольку это соединение никогда не закрывается, оно остается открытым, ожидая большего количества запросов.

У вас возникли проблемы с управлением соединением с базой данных.


Поскольку я не могу воспроизвести вашу проблему, могли бы вы попробовать это, закрыть вашу базу данных таким образом:

@app.teardown_appcontext 
def close_database(error): 
    db.close() 

И вы можете получить некоторую информацию от Doc: Step 3: Database Connections

+0

Я попробовал @ app.teardown_appcontext, но все еще имею ту же самую – Alexander

3

Я знаю, что это старый вопрос, но поскольку ответа нет, я думал, что добавлю свои два цента.

У меня была такая же проблема, когда вы делали большие объемы данных в объектах Peewee (больше, чем количество данных, которое MySQL допускает по одному объявлению по умолчанию). Я исправил его, изменив размер max_allowed_packet в my.conf.

Чтобы сделать это, откройте my.conf, добавьте следующую строку под [mysqld]:

max_allowed_packet=50M

... или независимо от размера, вам нужно, и перезапустить туздЫ