我已准备好很多有关此问题的帖子。我的理解是应用程序有一个设置,说明在丢弃数据库连接并创建新数据库连接之前保持多长时间。 MySQL有一个设置,说明保持空闲连接的时间。没有站点活动后,MySQL会超时应用程序的连接。但应用程序不知道这一点,仍然尝试使用现有的连接,但失败了。失败后,应用程序断开连接并创建一个新连接,然后就可以了。
我在本地mysql服务器上将 wait_timeout 设置为10秒。我在本地运行的应用程序上将 pool_recycle 设置为5秒。在10秒不活动后,我发出请求,但仍然收到此错误。之后在10秒内发出另一个请求,那就没问题了。等待超过10秒,再次出现此错误。
有什么想法吗?
mysql> SELECT @@global.wait_timeout\G
*************************** 1. row ***************************
@@global.wait_timeout: 10
1 row in set (0.00 sec)
sqlalchemy.twelvemt.pool_recycle = 5
engine = engine_from_config(settings, 'sqlalchemy.twelvemt.')
DBSession.configure(bind=engine)
OperationalError: (OperationalError) (2006, 'MySQL server has gone away') 'SELECT beaker_cache.data \nFROM beaker_cache \nWHERE beaker_cache.namespace = %s' ('7cd57e290c294c499e232f98354a1f70',)
答案 0 :(得分:2)
您的Beaker连接而不是您的DBSession连接似乎引发了您所获得的错误 - 需要为每个连接设置pool_recycle选项。
假设您正在x.ini文件中配置Beaker,您可以通过session.sa.*
传递sqlalchemy选项,因此session.sa.pool_recycle = 5
请参阅http://docs.pylonsproject.org/projects/pylons-webframework/en/v0.9.7/sessions.html#sa
答案 1 :(得分:2)
sqlalchemy.pool_recycle
使用mySQL
时,我总是将其添加到配置文件中sqlalchemy.pool_recycle = 3600
如果没有这个,我会在活动长时间暂停后第一次请求MySQL server has gone away
。
答案 2 :(得分:0)
我通过在每次请求后调用session上的remove()来修复此问题。您可以通过定义全局函数来完成此操作:
def remove_session(request, response):
request.dbsession.remove()
之后,您将此函数设置为由涉及请求和数据库会话的每个类运行:
def __init__(self, request):
request.dbsession = DBSession
request.add_response_callback(remove_session)
这是有效的,因为SQLAlchemy希望其用户处理数据库会话的打开和关闭。有关详细信息,请参阅documentation。