2015-12-02 130 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錯誤之後, 「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文檔已經談到這個問題,這裏是鏈接:MySQL的殺死空閒數據庫連接時,可能會發生Error 2006: MySQL server has gone away

此特定錯誤。這通常發生在未明確管理數據庫連接的Web應用程序上。會發生什麼情況是您的應用程序啓動,將打開一個連接來處理執行的第一個查詢,並且由於該連接永遠不會關閉,因此該連接保持打開狀態,以等待更多查詢。

因此,您在管理數據庫連接時遇到了一些問題。


既然我無法重現你的問題,你可以請試試這一個,閉上你的數據庫是這樣的:

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

而且你可能會從文檔的一些信息:Step 3: Database Connections

+0

我試過@ app.teardown_appcontext,但仍然有同樣的stuation – Alexander

3

我知道這是一個古老的問題,但由於沒有公認的答案,我想我會加兩分錢。

我在Peewee對象中提交大量數據時遇到了同樣的問題(大於MySQL默認允許的單個提交的數據量)。我通過更改my.conf中的max_allowed_pa​​cket大小來修復它。

要做到這一點,開放my.conf,添加以下行[mysqld]下:

max_allowed_packet=50M

......或任何大小,你需要和重啓mysqld