摘要
本文部分内容来源于网络,个人收集整理,请勿传播
在使用原生sql的方式操作数据库时,如果需要并发的时候,直接连接数据库的方式会出现抢占资源的情况出现,因此此时就需要使用数据库连接池来解决这个问题。
数据库连接池
- djanjo直接用ORM(pymysql/MySQLdb)
- flask或者其他
- 原生sql
- pymysql(py2/3)
- MySQLdb(py2)
- ORM(SQLAchemy)(pymysql/MySQLdb)
- 原生sql
BDUtils
1 | pip install DBUtils |
DBUtils是Python的一个用于实现数据库连接池的模块。
此连接池有两种连接模式:
模式一
为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。
1 | POOL = PersistentDB( |
模式二
创建一批连接到连接池,供所有线程共享使用。
PS:由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享。
1 | import time |
加锁
如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。
1 | #!/usr/bin/env python |
无锁(报错)
1 | #!/usr/bin/env python |
PS: 查看连接 show status like ‘Threads%’;
工作中使用
正常工作中应使用单例模式来使用数据库连接池
- 先封装一个数据库操作对象