MySQL- Python 建立的 db.connect() 需要每次关闭吗?

2019-03-21 22:41:02 +08:00
 miniyao

有一个 while 循环业务,每 10 分钟去请求一下,发现有数据更新了,就抓过来存到 MySQL 中去。

import MySQLdb
db = MySQLdb.connect(host='localhost', port=3306, user='xxx', passwd='xxx', db='xxx_DB', charset='utf8')
cursor = db.cursor() 
# do something...
db.commit()

请教:每次把数据存到 MySQL 中去了之后,要用 db.close()吗?

1、如果没有 db.close(),多长时间之后,这次连接会自动 close 掉?
2、如果不执行 db.close(),因为是个 while 循环,是不是每次都会重新建立一个 db 连接?
3、如果每次都执行 db.close(),那么下次又要重新建立连接,这样性能有多大损耗?

9580 次点击
所在节点    Python
33 条回复
fngtz
2019-03-22 09:59:59 +08:00
Northxw
2019-03-22 10:05:12 +08:00
@fngtz 🤝
qq976739120
2019-03-22 10:17:15 +08:00
用链接池也要 close 的.....
wuyue92tree
2019-03-22 11:49:01 +08:00
连接池 + 单例模式建立 mysql 对象
不 close,时间久了,TCP 链接会多到爆,性能杀手
joyc
2019-03-22 13:17:42 +08:00
@Torpedo 和谐到大家都找回了年轻时的自己
aploium
2019-03-22 13:39:26 +08:00
可以用 sqlalchemy 自带的连接池, 如
engine=sqlalchemy.create_engine(DB_URL)
result_proxy=engine.execute('some sql')
rows=result_proxy.fetchall()

不用专门去考虑连接池和释放的问题, 里面内置了
1762628386
2019-03-22 15:15:26 +08:00
啊...看到楼主的问题仿佛遇到了 4 年前的自己.

换个思路,只去判断是否抓取即刻,10 分钟的定时交给外部命令:crontab supervise,做好进程监控。
hayi
2019-03-22 15:38:48 +08:00
torndb 模块可以解决
Vegetable
2019-03-22 16:08:46 +08:00
我...不回忆能回答问题吗?

我举个例子

比如我想上厕所需要纸
纸是公司提供的,放在行政那里

好,现在问题变了:

我上厕所用完纸需要每次都给让行政拿回去吗?

正常情况下,还与不还都无所谓,因为你不叫她过来拿,过了 8 小时(默认可配置)不用的话行政小妹会自己从我兜里拿走.
有些程序没处理这情况,以为自己有纸,就出现了裤子都脱了最后发现:"卧槽我纸呢?!"程序报错(2006 gone away).

所以如果不是特别高的负载,就还回去好了.

那么如果负载特别高呢?比如拉肚子了一天去很多次,还来还去的太麻烦了,耽误事憋不住不就完了吗?
这情况能不还就不还了,影响性能.

离得近的几个人成立了一个小组共同保管 3 包纸(连接池),同时有一个小弟负责和行政沟通纸的一切事宜,那么组里别人就不用管纸的事情了,一伸手就肯定有.

所以没什么标准答案,合适就好.最简单就是每次都重新打开一个,用完关了.建议从这个方案开始
Raymon111111
2019-03-22 16:22:46 +08:00
用连接池, 不要自己管理这个.

如果是学习的目的可以仔细研究研究.
boxvivi007
2019-03-22 20:00:37 +08:00
为什么不用 with 语句自动管理上下文
fngtz
2019-04-01 09:46:48 +08:00
@Northxw 哎呀,我之前的想法不太对。虽然正常不用 del,但是数据库属于特殊的领域。sqlalchemy 就是在连接池对象的__del__里面关闭数据库连接的。
Northxw
2019-04-01 13:22:01 +08:00
@fngtz 哦豁? 还惦记着啊。🤝

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

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

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

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

© 2021 V2EX