python storm/web.py:用mysql数据库正确处理disconnectionerror

uqxowvwt  于 2021-06-26  发布在  Storm
关注(0)|答案(1)|浏览(483)

我正在编写一个基于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)在对数据库执行写操作时不包括事务处理(回滚)。不过,至少目前它是存储上所有读取操作的可接受修复程序。

5q4ezhmt

5q4ezhmt1#

也许您可以使用web.py的应用程序处理器 Package 控制器方法并从中捕获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结合使用的食谱条目:http://webpy.org/cookbook/sqlalchemy 为风暴做些类似的事:

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)

相关问题