我准备了很多关于这个问题的帖子。我的理解是,应用程序有一个设置,它说明在删除数据库连接和创建新连接之前需要多长时间保持空闲数据库连接。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',)
发布于 2014-09-07 12:59:22
看起来,您得到的错误是由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
发布于 2014-11-18 20:03:46
尝试为连接设置sqlalchemy.pool_recycle
使用mySQL时,我总是将其添加到配置文件中。
sqlalchemy.pool_recycle = 3600没有这一点,在活动暂停很长时间后,我将获得第一个请求的MySQL server has gone away。
发布于 2015-06-10 18:34:16
我通过在每次请求之后的会话上调用remove()来修正这个问题。您可以通过定义一个全局函数来做到这一点:
def remove_session(request, response):
request.dbsession.remove()然后,将此函数设置为由每个涉及请求和数据库会话的类运行:
def __init__(self, request):
request.dbsession = DBSession
request.add_response_callback(remove_session)这是因为SQLAlchemy希望它的用户处理数据库会话的打开和关闭。更多信息可以在文档中找到。
https://stackoverflow.com/questions/20553244
复制相似问题