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(),那么下次又要重新建立连接,这样性能有多大损耗?

9560 次点击
所在节点    Python
33 条回复
CallMeReznov
2019-03-21 23:07:50 +08:00
啊...看到楼主的问题仿佛遇到了 5 年前的自己.

1.超时时间设置
2.连接数一般是有限的,你只建立不释放的后果就是在超时时间内达到最大连接数会导致你无法继续
3.比起上面两个造成的问题,建立-执行-关闭,这都属于正常的负载范围,如果你的数据库载体这点操作都无法顺利进行你就地想办法优化提升你的服务器处理能力或者优化你的 SQL 语句了
Northxw
2019-03-22 00:21:11 +08:00
额,仿佛看到大二的自己...

简单来说,构造一个数据库的类,在__init__中初始化,在__del___中自动关闭数据库连接,再设置一个只进行插入操作的函数。 最后生成一个类的实例,While 定时循环调用实例中插入操作函数,应该就 OJBK 了。大概这样:

class Save(object):
def __init__(self):
self.localhost = 'localhost'
self.user= 'root' # 或者其他
self.pass_ = 'xxxx'
self.port= 3306
self.db= 'database_name'

def __del__(self):
self.db.close()

def save(self):
pass

if main == '........'(忘了):
save_mysql = Save()
while True:
save_mysql.save()
hcymk2
2019-03-22 00:30:20 +08:00
用链接池
zjp
2019-03-22 00:42:05 +08:00
同仿佛大二的自己…
MySQL 会自动关闭空闲 8 小时的连接,这个时间由 wait_timeout 配置。貌似多数数据库不会自动关闭
3. 一般程序都会用连接池,不过 10 分钟才一次的随便了……毕竟有些连接池默认 30 分钟也会全部重新连接或者直接 close
kernel
2019-03-22 06:36:52 +08:00
10 分钟一次就重新连就行了。你想想很早以前用 PHP 写网页,每一个请求都重新连一下,你这 10 分钟一次频率算个鸟。
ericgui
2019-03-22 06:49:35 +08:00
@CallMeReznov 一个氛围良好的社区就应该多一些这样的人 @Livid

最近 v 站太多乱七八糟、阴阳怪气的沙雕了
ericgui
2019-03-22 06:50:21 +08:00
@CallMeReznov
@Northxw
@zjp

良好氛围的创造,离不开这样的人,+10086
fngtz
2019-03-22 08:28:05 +08:00
@Northxw python 一般不用 del。需要 clos 的对象 e 可以用上下文( enter,exit )。
Torpedo
2019-03-22 08:54:47 +08:00
这个帖子好和谐
Sothoth
2019-03-22 09:01:23 +08:00
加个装饰器
Northxw
2019-03-22 09:05:25 +08:00
@fngtz 额,还好吧,我一直在用,哈哈,🤝
coolair
2019-03-22 09:11:12 +08:00
如果是循环插数据,可以先把数据放列表,然后一次插入多条数据,如果数据量大,可以设置一个长度,比如 500 条写一次数据库。
David1119
2019-03-22 09:15:56 +08:00
推荐直接使用 sqlalchemy 的连接池,性能很好,可以用 orm,也可以直接用 raw sql。
另外 django 遇到高并发问题性能不行,用 sqlalchemy 替代原来的 connection 并加上连接池,性能翻倍。
zuoakang
2019-03-22 09:19:15 +08:00
连接池有用
ctro15547
2019-03-22 09:28:58 +08:00
刚开始学的话可以不停重连关闭没关系,用学校的电脑数据库一般处理能力每秒几千莫得问题,可以不用担心性能问题
inhzus
2019-03-22 09:29:20 +08:00
一定要记得 close 的。去年有个大一的学弟一起做个项目,好好的突然怎么都不能连接数据库。后来查日志发现他代码全部都是只管 connect 不管 close,超过最大连接数就凉凉。
dnsaq
2019-03-22 09:32:20 +08:00
首先不要想着 mysql 自动帮你关闭因为实际没有屁用甚至会把业务搞崩,自己骗自己,严格要求自己 colse 或者连接池,我公司的程序天天报超出 max con 还找运维的问题
wly19960911
2019-03-22 09:38:39 +08:00
连接池管理 sql 的连接 ,连接池会保持几条连接,并且根据并发会新开到一定限制数量的连接,然后会自己关闭,你只需要从连接池拿连接就好,自己不用创建连接。
Nicoco
2019-03-22 09:46:13 +08:00
SQLAlchemy 值得选择
suueyoung
2019-03-22 09:52:30 +08:00
with statement

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

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

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

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

© 2021 V2EX