Python Pyramid SQLAlchemy,MySQL服务器已经消失

时间:2013-12-12 20:10:10

标签: python mysql sqlalchemy pyramid

我已准备好很多有关此问题的帖子。我的理解是应用程序有一个设置,说明在丢弃数据库连接并创建新数据库连接之前保持多长时间。 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',)

3 个答案:

答案 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