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

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

案例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

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

user_dao.py

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

news_dao.py

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

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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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