关于 MySQLdb 重连的问题

2015-02-26 22:37:27 +08:00
 jamiesun
MySQL server has gone away

一般我是直接修改my.cnf

wait_timeout=31536000
interactive_timeout=31536000


不过最近阿里云RDS连续3次主备切换,还是断。

MySQLdb貌似没有重连机制。


你们是如何解决的,比如这种数据库当机后恢复的情况
2909 次点击
所在节点    Python
7 条回复
VYSE
2015-02-26 23:59:00 +08:00
conn.ping(True)
cursor=....
lincanbin
2015-02-27 00:06:36 +08:00
from warnings import filterwarnings
filterwarnings('error', category = MySQLdb.Warning)
令Warning变为error,然后就可以开始捕获了
try

except
lianghui
2015-02-27 08:58:25 +08:00
你这配置太逗,服务器基本设置为10秒idle 给你一个客户端的重置参考下

https://github.com/thomashuang/dbpy/blob/master/db/mysql/connection.py
jamiesun
2015-02-28 00:01:36 +08:00
@lianghui 你这个是短连接的搞法,我用的是连接池。连接池没有实现ping,自动重连。
jamiesun
2015-02-28 00:30:04 +08:00
看来还是没有仔细读sqla的文档,加个参数就ok了,再也不用暴力解决问题了

from sqlalchemy import create_engine
e = create_engine("mysql://scott:tiger@localhost/test", pool_recycle=3600)
lianghui
2015-02-28 09:30:01 +08:00
@jamiesun 对于idle的处理在pool和连接类处理问题idle问题不大,基本都是要每次使用check, 不过你已经用sqla,不过还是推荐你看看连接池的实现,你也可以去看看sqla的pool实现,不过他的pool为了适配多种数据库engine有很多特殊的处理,比如线程安全,然后什么queuepool,异步pool之类的
https://github.com/thomashuang/dbpy/blob/master/db/_db.py
https://github.com/thomashuang/dbpy/blob/master/db/pool.py
jamiesun
2015-02-28 09:42:53 +08:00
@lianghui 谢谢, 以前看过dbutils的一些,不过我确实需要解决多种数据库适配,最后还是用sqla全部来做了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/173065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX