Python金字塔SQLAlchemy,MySQL服务器已经消失了
我已经准备了很多关于这个问题的帖子。我的理解是,应用程序有一个设置,说明在删除和创建新的数据库连接之前,要保持空闲的数据库连接多长时间。MySQL有一个设置,说明保持空闲连接的时间。在没有站点活动之后,MySQL会超时应用程序的连接。但应用程序不知道这一点,仍然尝试使用现有连接,但失败了。故障发生后,应用程序将断开连接并建立一个新的连接,然后一切正常 我在本地mysql服务器上将等待超时设置为10秒。在本地运行的应用程序上,我已将池回收设置为5秒。在10秒钟的不活动之后,我发出了一个请求,但仍然收到这个错误。在10秒内再提出一个请求,就可以了。等待时间超过10秒,将再次出现此错误 有什么想法吗Python金字塔SQLAlchemy,MySQL服务器已经消失了,python,mysql,sqlalchemy,pyramid,Python,Mysql,Sqlalchemy,Pyramid,我已经准备了很多关于这个问题的帖子。我的理解是,应用程序有一个设置,说明在删除和创建新的数据库连接之前,要保持空闲的数据库连接多长时间。MySQL有一个设置,说明保持空闲连接的时间。在没有站点活动之后,MySQL会超时应用程序的连接。但应用程序不知道这一点,仍然尝试使用现有连接,但失败了。故障发生后,应用程序将断开连接并建立一个新的连接,然后一切正常 我在本地mysql服务器上将等待超时设置为10秒。在本地运行的应用程序上,我已将池回收设置为5秒。在10秒钟的不活动之后,我发出了一个请求,但仍然
mysql> SELECT @@global.wait_timeout\G
*************************** 1. row ***************************
@@global.wait_timeout: 10
1 row in set (0.00 sec)
看起来您遇到的错误是由烧杯连接抛出的,而不是由DBSession连接抛出的——需要为每个连接设置pool\u recycle选项 假设您正在x.ini文件中配置烧杯,您可以通过
session.sa.*
传递sqlalchemy选项,因此session.sa.pool\u recycle=5
请参见尝试设置sqlalchemy.pool\u recycle
,了解您的连接
在使用mySQL时,我总是将其添加到我的配置文件中
sqlalchemy.pool_recycle = 3600
如果没有这一点,MySQL服务器在活动中长时间暂停后的第一次请求中就消失了。我通过在每次请求后的会话中调用remove()修复了这一问题。可以通过定义全局函数来实现这一点:
def remove_session(request, response):
request.dbsession.remove()
然后,将此函数设置为由涉及请求和数据库会话的每个类运行:
def __init__(self, request):
request.dbsession = DBSession
request.add_response_callback(remove_session)
这是因为SQLAlchemy希望其用户能够处理数据库会话的打开和关闭。有关更多信息,请参阅
sqlalchemy.pool_recycle = 3600
def remove_session(request, response):
request.dbsession.remove()
def __init__(self, request):
request.dbsession = DBSession
request.add_response_callback(remove_session)