……源码分析peewee的异常重试 …

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.  http://xiaorui.cc/?p=3520

Peewee 是个好用的orm,我们这边遇到复杂的业务逻辑都会使用orm来减轻我们写sql语句代码的痛苦。 几十个表,每个表都有几十个字段,时常要判断有无重复,检测缺少那些字段…..   前端时间遇到一问题,由于长时间没有对mysql读写,导致python peewee mysql连接老化,这个老化不是tcp层面的,是mysql会对client connection计时。 长时间没用,他会干掉你的连接。   你的peewee client会出现2006 Mysql server has gone away,这错误说明mysql server离你远去了,为毛,你总是不招惹她,她寂寞了就走了吧。   

一般用原生MysqlDB封装的数据接口会做try cache,出现mysql gone away 时捕获异常,然后重新建立一个连接就OK了。 但那么问题来了,你用的是orm peewee 模块。 你如果按照你以前的逻辑进行异常处理,会导致你的代码变丑。 搜了半天没找到合适的方案,就想在peewee源代码里找到一丝蛛丝马迹,  在Error异常处理里找到一个名叫RetryOperationalError的类,但在peewee doc里没找到相应的使用文档,只能自己琢磨了。  该类是python peewee 在2.7之后出的。

所有的有关mysql返回的异常,peewee都可以通过调用RetryOperationalError类解决重试,其实最主要是替换调用execute_sql().  也就是说,你如果想做实现一个更为复杂的异常处理,也是按着这个做。


再来看看peewee的异常处理的逻辑源码是怎么写的.

看了peewee代码后,看看我业务里是怎么调用这些处理异常的类。


解决mysql server 2006 gone away 除了这方法之外,还有比较暴力的方法是直接修改mysql server配置文件. 

我们可以把interactive_timeout \ wait_timeout 是一天,也就是36000秒, 即mysql链接在无操作36000秒后被自动关闭。   但是不推荐这么搞,原因你自己想想吧…  

那么我是怎么搞得?    我在mysqldb上封装了一个类似peewee的orm库,在初始化连接的时候会加入一个expire过期时间,只要符合过期时间,我就要重置一个连接,这样避免了2006 gone away的发生。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品