我的记忆是在使用连接后我们需要关闭它。但我发现一个有趣的事情,当连接变量无法访问时,看起来连接是自动关闭。
import MySQLdb
import time
def get_mysql_connection():
db = MySQLdb.connect(host="localhost",
user="test",
passwd="test",
db="test")
db.autocommit = True
return db
for _ in range(1,100):
print "get connection"
a = get_mysql_connection()
print id(a)
print a.autocommit
c = a.cursor()
c.execute("select 1")
print c.fetchall()
print "completed"
time.sleep(11000)
然后在mysql会话中运行
mysql> show processlist;
+-----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+------+---------+------+----------+------------------+
| 10 | test | localhost | NULL | Query | 0 | starting | show processlist |
| 310 | test | localhost | test | Sleep | 8 | | NULL |
+-----+------+-----------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)
我只看到2个会话,一个是我的mysql命令行,另一个来自我的python应用程序。
在我的python代码中,我打开100个连接,并且没有关闭它们中的任何一个。但是在应用程序中只到达了最后一个连接,因为变量a被重新分配给每个循环中的新连接。在python中没有到达所有其他99个连接。所以我想如果没有达到连接,那么它会以某种方式自动关闭。任何专家都可以证实这种行为吗?
更新: 在我添加
之后print id(a)
到函数,然后我发现id在2个不同的值之间变化,这意味着它必须使用连接池。我检查了文档,但是只有当pool_name或pool_size的pass参数创建连接池时才会说。不确定如何创建连接池,例如连接名称和我的代码中创建的池的连接大小。