程序是怎么保证连接池对象只有一个的

程序是怎么保证连接池对象只有一个的

案例1:老师原来代码

mysql_db.py 直接获取连接池

http://img1.sycdn.imooc.com//climg/5fbf2a4609f4930e05650364.jpg

user_dao.py 直接import使用

http://img1.sycdn.imooc.com//climg/5fbf2abf09c1324706340506.jpg

news_dao.py直接import使用

http://img1.sycdn.imooc.com//climg/5fbf2aa009a7c21c06820455.jpg

测试类创建两个dao对象并调用对应方法

http://img1.sycdn.imooc.com//climg/5fbf2b6809b5392f07760265.jpg

控制台打印信息:

获取连接池的代码只被执行了一次,两个Dao用的是同一个连接池

http://img1.sycdn.imooc.com//climg/5fbf2b95094837b409410135.jpg


案例2:修改后

mysql_db.py改成增加了个函数来获取连接池

http://img1.sycdn.imooc.com//climg/5fbf28df09c7985f05250631.jpg

user_dao.py通过函数获取连接池

http://img1.sycdn.imooc.com//climg/5fbf290e094b362a05670295.jpg

news_dao.py也通过函数获取连接池

http://img1.sycdn.imooc.com//climg/5fbf294809b4fd1c06060270.jpg

测试类创建两个dao对象并调用对应方法

http://img1.sycdn.imooc.com//climg/5fbf299f09c2e42307890376.jpg

控制台打印信息:

确定函数被调用了两次,但看地址应该是同一个连接池对象

http://img1.sycdn.imooc.com//climg/5fbf29c20934944109390183.jpg


问题:

1、案例1里的两个dao都调用了获取连接池的代码,为什么那段代码只被执行了一次?

2、案例2里获取连接池的函数被调用了两次,为什么不会创建两个不同的连接池?

3、以import引入的对象与函数获取的方式有什么不同?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕美 2020-11-26 14:54:10

同学,你好

1、mysl_db中的pool只创建了一次,内存中已经有了pool变量,从xxx文件中导入pool变量,并不会再次创建,因此连接池是唯一的。

2、impor导入的是已经存在的变量,即从mysql_db文件中导入pool,而函数获取是在调用函数时重新创建pool连接池

3、mysql_db.py

import mysql.connector.pooling

__config = {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "123456",
"database": "vega"
}
def get_pool():
try:
print('连接池')
pool = mysql.connector.pooling.MySQLConnectionPool(
**__config,
pool_size=10
)
return pool
except Exception as e:
print(e)

user_dao.py

from db import mysql_db

class UserDao:
# 验证用户登录
def login(self, username, password):
try:
pool = mysql_db.get_pool()
print(id(pool))
con = pool.get_connection()
print('userdao', con)
except Exception as e:
print(e)
finally:
if "con" in dir():
# 归还连接
con.close()

news_dao.py

from db import mysql_db

class NewsDao:
# 查询待审批新闻列表
def search_unreview_list(self, page):
try:
pool = mysql_db.get_pool()
print(id(pool))
con = pool.get_connection()
print('newsdao',con)
except Exception as e:
print(e)
finally:
if "con" in dir():
con.close()

4、在myqsl_db中创建了连接池pool,在其他文件中导入pool即可。和在a.py文件中定义变量name,在b.py文件中导入name,在输出name时值是一样的

例:

http://img1.sycdn.imooc.com//climg/5fbf50930960754f03040116.jpg

http://img1.sycdn.imooc.com//climg/5fbf50a5099be84703840237.jpg

阿鲲 提问者 2020-11-26 14:32:04

1、老师,我明白只要是一个连接池,任何功能都可以从里面拿连接用,用完归还到池里其它功能模块可以再拿去用,我的纠结不在于连接池里的连接,而是连接池对象的唯一性。
2、我的问题3也麻烦老师确定下呢
3、老师的解答2里我看确实是两个不同的连接池对象,老师的mysql_db.py代码是怎样的。
我的测试代码加上id也是同样的id,其实和看到的对象地址是差不多意思。
4、正常一个应用确实只要一个连接池对象就够了,多余一个耗资源也没必要。我是不能理解这个案例里是怎么保证这个连接池对象的唯一性。

好帮手慕美 2020-11-26 13:57:40

同学,你好。

1、案例1中pool调用了两次但只被创建了一次,该连接池中有10连接,在每次执行完之后都会归还连接到连接池,下次再执行时会选择空闲的连接,第二次执行时也可能会使用到上次的连接,因此导致调用两次但使用的是同一个连接

http://img1.sycdn.imooc.com//climg/5fbf47c20911607205680313.jpg

去掉finally中的代码可以看到pool的id是一样的,但是连接池中的两个不同的连接

http://img1.sycdn.imooc.com//climg/5fbf43a4096733a411830157.jpg

2、案例2中调用了两次get_pool()创建了两个连接池,可以看到是两个不同的id值,同学可以打印id值看下

http://img1.sycdn.imooc.com//climg/5fbf41e0090d5a5205650268.jpg

http://img1.sycdn.imooc.com//climg/5fbf41fe09ef1a9705850268.jpg

http://img1.sycdn.imooc.com//climg/5fbf41c509fddb9811950186.jpg

  • 提问者 阿鲲 #1
    1、老师,我明白只要是一个连接池,任何功能都可以从里面拿连接用,用完归还到池里其它功能模块可以再拿去用,我的纠结不在于连接池里的连接,而是连接池对象的唯一性。 2、我的问题3也麻烦老师确定下呢 3、老师的解答2里我看确实是两个不同的连接池对象,老师的mysql_db.py代码是怎样的。 我的测试代码加上id也是同样的id,其实和看到的对象地址是差不多意思。 4、正常一个应用确实只要一个连接池对象就够了,多余一个耗资源也没必要。我是不能理解这个案例里是怎么保证这个连接池对象的唯一性。
    2020-11-26 14:33:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师