在自己的云服务器上建了个Mysql数据库,每次操作连接Mysql的时候插入一条数据关闭连接,插入一条数据连接关闭太浪费资源了,虽然自己的云服务器上,Mysql也只有自己连,但是每次用云服务的时候都觉得像喉咙里卡了个苍蝇.
能不能像Java一样搞个数据库连接池,需要的时候从连接池里拿,用完了再放回去?
Python版本:3.6.5
Mysql版本:5.6.39
pip版本:18.1
操作系统:Deepin(Linux)
开发环境:Pycharm 2017.1.1
Git版本:2.17.0
(当然下面的这些相对来说不那么重要)
安装Mysql连接驱动
pip3 install PyMySQL
# 安装数据库连接工具包
pip3 install DBUtils
当然你也可以通过Git源码进行安装,或者Pycharm虚拟环境,再或者AnaConda
if __name__ == '__main__':
config = {
'host': '192.168.0.101',
'port': 3306,
'database': 'wedo',
'user': 'wedo',
'password': 'xxxxxx',
'charset': 'utf8'
}
db_pool = PersistentDB(pymysql, **config)
# 从数据库连接池是取出一个数据库连接
conn = db_pool.connection()
cursor = conn.cursor()
# 来查下吧
cursor.execute('select * from books')
# 取一条查询结果
result = cursor.fetchone()
print(result)
# 关闭连接,其实不是关闭,只是把该连接返还给数据库连接池
conn.close()
上面是一个最简单的Demo,那些复制的参数什么的都省了,后面再根据需要进行添加
这是运行结果
这是数据库中完整的数据
OK用起来就这么简单,说一下这短短的几行代码是什么意思
第一个参数(也就是pymysql
)用于指定数据库连接驱动,
config
字典自然就是Mysql数据库的连接信息啦
其他的像限制最大,最小连接数量,最大最小缓存数啊什么的这里统统都没有设置,都使用默认的,也就是没有限制
DBUtils库实际上是一个包含两个子模块的Python包:
1.用于连接DB-API 2模块,这个可以连接Mysql,Oracle,啊什么的
2.用于连接PyGreSQL
模块,这个是用来访问PostgreSQL
数据库的
这里用第一个
DB-API 2模块又主要包含两个模块:
PooledDB
这个用于多线程的,如果你的程序频繁地启动和关闭纯种,最好使用这个PersistentDB
这个用于单线程,如果你的程序只是在单个线程上进行频繁的数据库连接,最好使这个当然这两个模块的接口(也就是参数啦)很相似的,上面的代码你把PersistentDB
换成PooledDB
完全没有问题,只要别出线程安全的问题就行.
平时写着玩儿的话这个简单的Demo就够了,如果你想更详细了解一下看下面:
PooledDB
和PersistentDB
还有以下参数:
maxconnections
: 接池允许的最大连接数,0和None表示没有限制(默认)mincache
: 初始化时,连接池至少创建的空闲连接,0表示不创建maxcached
: 连接池中空闲的最多连接数,0和None表示没有限制maxshared
:连接池中最多共享的连接数量,0和None表示全部共享(其实没什么用)blocking
: 连接池中如果没有可用共享连接后,是否阻塞等待,True表示等等,False表示不等待然后报错setsession
: 开始会话前执行的命令列表ping
: ping Mysql服务器检查服务是否可用"""
数据库连接工具类
# """
import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection
from DBUtils.PersistentDB import PersistentDB, PersistentDBError, NotSupportedError
config = {
'host': '192.168.0.101',
'port': 3306,
'database': 'wedo',
'user': 'wedo',
'password': 'xxxxxxxx',
'charset': 'utf8'
}
def get_db_pool(is_mult_thread):
if is_mult_thread:
poolDB = PooledDB(
# 指定数据库连接驱动
creator=pymysql,
# 连接池允许的最大连接数,0和None表示没有限制
maxconnections=3,
# 初始化时,连接池至少创建的空闲连接,0表示不创建
mincached=2,
# 连接池中空闲的最多连接数,0和None表示没有限制
maxcached=5,
# 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用)
maxshared=3,
# 连接池中如果没有可用共享连接后,是否阻塞等待,True表示等等,
# False表示不等待然后报错
blocking=True,
# 开始会话前执行的命令列表
setsession=[],
# ping Mysql服务器检查服务是否可用
ping=0,
**config
)
else:
poolDB = PersistentDB(
# 指定数据库连接驱动
creator=pymysql,
# 一个连接最大复用次数,0或者None表示没有限制,默认为0
maxusage=1000,
**config
)
return poolDB
if __name__ == '__main__':
# 以单线程的方式初始化数据库连接池
db_pool = get_db_pool(False)
# 从数据库连接池中取出一条连接
conn = db_pool.connection()
cursor = conn.cursor()
# 随便查一下吧
cursor.execute('select * from books')
# 随便取一条查询结果
result = cursor.fetchone()
print(result)
# 把连接返还给连接池
conn.close()