2015-12-02 133 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