Python storm/web.py:使用MySQL数据库正确处理DisconnectionError

Python storm/web.py:使用MySQL数据库正确处理DisconnectionError,python,web.py,apache-storm,Python,Web.py,Apache Storm,我正在编写一个基于web.py的web服务,使用storm作为从MySQL数据库查询记录的ORM层。web服务是在Linux机器上使用Apache2通过mod_wsgi部署的。当脚本启动时,我使用storm的create_database方法创建到MySQL数据库服务器的连接。这也是我创建Store对象的地方,稍后当请求传入时,它将用于执行查询 在几个小时的不活动之后,store.find抛出一个DisconnectionError:2006,“MySQL服务器消失了”。当Apache/mod_

我正在编写一个基于web.py的web服务,使用storm作为从MySQL数据库查询记录的ORM层。web服务是在Linux机器上使用Apache2通过mod_wsgi部署的。当脚本启动时,我使用storm的create_database方法创建到MySQL数据库服务器的连接。这也是我创建Store对象的地方,稍后当请求传入时,它将用于执行查询

在几个小时的不活动之后,store.find抛出一个DisconnectionError:2006,“MySQL服务器消失了”。当Apache/mod_wsgi重用Python进程而没有长时间重新初始化它们时,数据库连接被删除,我并不感到奇怪。我的问题是如何正确处理这个问题

我尝试设置一种机制,通过每300秒向MySQL服务器发送一个循环SELECT 1来保持与MySQL服务器的连接。不幸的是,这在我们的测试机上解决了这个问题,但在我们的演示部署上却没有。哎哟,当两者共享相同的MySQL配置时,wait_timeout设置为8小时

我已经搜索了将storm store重新连接到数据库的解决方案,但没有找到任何复杂的解决方案。唯一的建议似乎是必须捕获异常,将其视为不一致,调用存储上的回滚,然后重试。然而,这意味着我要么必须包装整个Store类,要么反复实现相同的重试机制。是有更好的解决方案,还是我完全搞错了


更新:我添加了一个web.py处理器,该处理器通过在捕获异常时重新创建storm存储,然后按照Andrey的建议重试该操作,从而优雅地处理断开连接错误。但是,这是一个不完整且次优的解决方案,因为存储被少数对象引用以供重用,这需要一个额外的机制来重新连接每个对象上的存储引用,并且b,它不包括在数据库上执行写操作时的事务处理回滚。但是,至少目前它是存储上所有读取操作的可接受修复程序。

也许您可以使用web.py来包装控制器方法并从中捕获DisconnectionError。大概是这样的:

def my_processor(handler): 
    tries = 3
    while True:
        try:
            return handler() 
        except DisconnectionError:
            tries -= 1
            if tries == 0:
                raise
或者,您可以查看有关如何使用application processor将SqlAlchemy与web.py:结合使用的食谱条目,并为storm制作类似的内容:

def load_storm(handler):
    web.ctx.store = Store(database)
    try:
        return handler()
    except web.HTTPError:
       web.ctx.store.commit()
       raise
    except:
        web.ctx.store.rollback()
        raise
    finally:
        web.ctx.store.commit()

app.add_processor(load_storm)

谢谢Andrey,我已经在做类似的事情了。然而,不幸的是,这并没有回答实际的问题-处理错误w.r.t storm的正确方法是什么,以及如何在内部处理事务,特别是在将storm与web.py一起使用时?我没有使用storm,但从文档中可以看出它有提交和回滚方法,就像SqlAlchemy一样。另外,文档提到storm的商店是,这意味着您应该在每次请求时创建它,或者实现您自己的商店管理器。我已经更新了我的示例,说明我认为它应该如何工作,但不要想当然。