我正在编写一个基于web.py的web服务,使用storm作为orm层从mysql数据库中查询记录。web服务是在linux机器上使用apache2通过mod\u wsgi部署的。当脚本使用storm的脚本启动时,我创建了到mysql数据库服务器的连接 create_database()
方法。这也是我创建 Store
对象,稍后在请求传入时用于执行查询。
几个小时不活动之后, store.find()
抛出 DisconnectionError: (2006, 'MySQL server has gone away')
. 当apache/modïwsgi重用python进程而没有长时间重新初始化它们时,数据库连接被删除,我并不感到惊讶。我的问题是如何正确处理这个问题?
我尝试设置一种机制,通过向mysql服务器发送一个循环的“select1”(每300秒)来保持与mysql服务器的连接。不幸的是,这在我们的测试机上解决了这个问题,但在我们的演示部署(哎哟)上却没有,因为两者共享相同的mysql配置( wait_timeout
设置为8小时)。
我已经搜索了将storm商店重新连接到数据库的解决方案,但没有找到任何复杂的解决方案。唯一的建议似乎是必须捕捉异常,将其视为不一致的调用 rollback()
然后重试。然而,这意味着我要么要 Package 整个 Store
反复初始化或实现相同的重试机制。有没有更好的解决办法,或者我是不是完全错了?
更新:我添加了一个web.py处理器,如果捕获到异常,它会重新创建storm存储,然后像andrey建议的那样重试操作,从而优雅地处理断开连接错误。但是,这是一个不完整且次优的解决方案,因为(a)存储被少数对象引用以供重用,这需要一个额外的机制来重新连接每个对象上的存储引用,并且(b)在对数据库执行写操作时不包括事务处理(回滚)。不过,至少目前它是存储上所有读取操作的可接受修复程序。
1条答案
按热度按时间5q4ezhmt1#
也许您可以使用web.py的应用程序处理器 Package 控制器方法并从中捕获disconnectionerror。像这样:
或者,您可以查看如何使用application processor将sqlalchemy与web.py结合使用的食谱条目:http://webpy.org/cookbook/sqlalchemy 为风暴做些类似的事: