Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python金字塔SQLAlchemy,MySQL服务器已经消失了_Python_Mysql_Sqlalchemy_Pyramid - Fatal编程技术网

Python金字塔SQLAlchemy,MySQL服务器已经消失了

Python金字塔SQLAlchemy,MySQL服务器已经消失了,python,mysql,sqlalchemy,pyramid,Python,Mysql,Sqlalchemy,Pyramid,我已经准备了很多关于这个问题的帖子。我的理解是,应用程序有一个设置,说明在删除和创建新的数据库连接之前,要保持空闲的数据库连接多长时间。MySQL有一个设置,说明保持空闲连接的时间。在没有站点活动之后,MySQL会超时应用程序的连接。但应用程序不知道这一点,仍然尝试使用现有连接,但失败了。故障发生后,应用程序将断开连接并建立一个新的连接,然后一切正常 我在本地mysql服务器上将等待超时设置为10秒。在本地运行的应用程序上,我已将池回收设置为5秒。在10秒钟的不活动之后,我发出了一个请求,但仍然

我已经准备了很多关于这个问题的帖子。我的理解是,应用程序有一个设置,说明在删除和创建新的数据库连接之前,要保持空闲的数据库连接多长时间。MySQL有一个设置,说明保持空闲连接的时间。在没有站点活动之后,MySQL会超时应用程序的连接。但应用程序不知道这一点,仍然尝试使用现有连接,但失败了。故障发生后,应用程序将断开连接并建立一个新的连接,然后一切正常

我在本地mysql服务器上将等待超时设置为10秒。在本地运行的应用程序上,我已将池回收设置为5秒。在10秒钟的不活动之后,我发出了一个请求,但仍然收到这个错误。在10秒内再提出一个请求,就可以了。等待时间超过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)