1.Flask路由 |
数据库链接池负责分配、管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是再从新创建一个;释放空闲时间超过最大空闲时间的数据库链接来避免由于没有释放数据库链接而引发的数据库链接资源。mysql
用户每次请求都须要向数据库得到连接,而数据库建立链接一般须要消耗相对较大的资源,建立时间也较长。假设网站一天10万访问量,数据库服务器就须要建立10万次链接,极大的浪费数据库的资源,而且极易形成数据库服务器内存溢出拓机。以下图所示:sql
数据库链接是一种关键的有限的昂贵的资源, 这一点在多用户的网页应用程序中体现的尤其突出。对数据库链接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标,数据库链接池正式针对这个问题提出来的。数据库链接池负责分配,管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是从新创建一个。以下图所示:数据库
数据库链接池在初始化时将建立必定数量的数据库链接放到链接池中,这些数据库链接的数量是由最小数据库链接数来设定的,不管这些数据库链接是否被使用,链接池都将一直保证至少拥有这么多的链接数量。链接池的最大数据库连接数量限定了这个链接池能占有的最大链接数,当应用程序向链接池请求的链接数超过最大链接数量时,这些请求将被加入到等待队列中。json
数据库链接池的最小链接数和最大链接数的设置要考虑到如下几个因素:浏览器
DBUtils是一套Python数据库链接池包,并容许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python 。安全
DBUtils提供两种外部接口:服务器
安装DButils,它依赖于pymysqlsession
pip install pymysql
pip install DBUtils
首先保证你有一个MySQL服务器,而且已经启动了!已经有一个数据库以及表数据app
以前咱们要操做MySQL,使用pymysql函数
import pymysql conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='student', charset='utf8') cur = conn.cursor(pymysql.cursors.DictCursor) # 插入一条数据 sql = "insert into stu(name,age) value ('%s','%s')" % ('小甜甜', 22) cur.execute(sql) conn.commit() cur.close() conn.close()
能够发现,每次操做数据库,都须要链接数据库。须要消耗连接时间!效率很是低!
新建文件utils.py,内容以下:
确保主机ip 127.0.0.1,数据库book,用户名root,密码为空,可以链接MySQL
import pymysql from DBUtils.PooledDB import PooledDB POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 链接池容许的最大链接数,0和None表示不限制链接数 mincached=2, # 初始化时,连接池中至少建立的空闲链接,0表示不建立 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=1, # 连接池中最多共享的链接数量,0和None表示所有共享。PS:无用,由于pymysql和MySQLdb等模块的threadsafety都 # 为1,全部值不管设置为多少,_maxcached永远为0,因此永远是全部链接都共享。 blocaking=True, # 链接池中若是没有可用链接后,是否阻塞等待,True,等待;False,不等待而后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表,如["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务器,检查是否服务可用。 # 如:0 = None = never, # 1 = default = whenever it is requested, # 2 = when a cursor is created, # 4 = when a query is executed, # 7 = always host='127.0.0.1', port=3306, user='root', password='', database='book', charset='utf8' )
maxconnections 最大链接数,不建议写0。可能会拖死服务器!
ping = 0 表示关闭服务检测。它会耗费服务器性能
注意:如下这些参数是必需要有的
creator=pymysql, host='127.0.0.1', port=3306, user='root', password='', database='book', charset='utf8' |
新建文件poolconn.py,确保book数据库已经建立了表student,并录入了数据
from utils import POOL import pymysql def func(): # 检测当前正在运行链接数的是否小鱼最大链接数,若是不小于则:等待或包raise TooManyConnections异常 # 不然,则优先去初始化时建立的链接中获取链接SteadyDBConnection。 # 而后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。 # 若是最开始建立的链接没有链接,组曲建立一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。 # 一旦关闭链接后,链接就返回到链接池让后续线程继续使用。 conn = POOL.connection() # 从链接池POOL中拿出一个已经建立好的链接,一次只能拿一个 cursor = conn.curson(pymysql.cursors.DictCursor) cursor.execute('select * from student') result = list(cursor.fetchall()) # 使用list效率是很低的,这里仅作测试 print(result) cursor.close() conn.close() func()
执行输出:
[{'age': 24, 'name': '韩雪', 'id': 1, 'gender': '女'}, {'age': 23, 'name': '舒畅', 'id': 2, 'gender': '女'}, {'age': 25, 'name': '唐嫣', 'id': 3, 'gender': '女'}] |
为了方便操做MySQL,须要将增删改查操做,封装成一个类,方便程序调用!
import pymysql from DBUtils.PooledDB import PooledDB import DB_config as Config """功能:PT数据库链接池""" class PTConnectionPool(object): __pool = None def __enter__(self): self.conn = self.__getConn() self.cursor = self.conn.cursor() print('PT数据库建立conn和cursor') return self def __getConn(self): if self.__pool is None: self.__pool = PooledDB(creator=pymysql, mincached=Config.DB_MIN_CACHED, maxcached=Config.DB_MAX_CACHED, maxshared=Config.DB_MAX_SHARED, maxconnections=Config.DB_MAX_CONNECYIONS, blocking=Config.DB_BLOCKING, maxusage=Config.DB_MAX_USAGE, setsession=Config.DB_SET_SESSION, host=Config.DB_TEST_HOST, port=Config.DB_TEST_POST, user=Config.DB_TEST_USER, passwd=Config.DB_TEST_PASSWORD, db=Config.DB_TEST_DBNAME, use_unicode=Config.DB_USE_UNICODE, charset=Config.DB_CHARSET) return self.__pool.connection() """summary:释放链接池资源""" def __exit__(self, type, value, trace): self.cursor.close() self.conn.close() print('PT链接池释放conn和cursor') # 重链接池中取出一个链接 def getconn(self): conn = self.__getConn() # 设置返回数据为字典 cursor = conn.cursor(pymysql.cursors.DictCursor) return cursor, conn def getPTConnection(): return PTConnectionPool()
配置文件:DB_config.py
# TEST数据库信息 DB_TEST_HOST = '192.168.37.131' DB_TEST_POST = '3306' DB_TEST_DBNAME = 'book' DB_TEST_USER = 'root' DB_TEST_PASSWORD = '123456' # 数据库链接编码 DB_CHARSET = 'utf8' # mincached:启动时开启的闲置链接数量(缺省值0开始时不建立链接) DB_MIN_CACHED = 10 # maxcached:链接池中容许的闲置的最多链接数量(缺省值0表明不闲置链接池大小) DB_MAX_CACHED = 10 # maxshared:共享链接数容许的最大数量(缺省值0表明全部链接都是专用的)若是达到了最大数量,被请求为贡献的链接将会被共享使用 DB_MAX_SHARED = 20 # maxconnecyions:建立链接池的最大数量(缺省值0表明不限制) DB_MAX_CONNECYIONS = 100 # blocking:设置在链接池达到最大数量时的行为(缺省值0或False表明返回一个错误<toMany...>其余表明阻塞直到链接数减小,链接被分配) DB_BLOCKING = True # maxusage:单个链接的最大容许复用次数(缺省值0或False表明不限制的复用),当达到最大数时,链接会自动从新链接(关闭和从新打开) DB_MAX_USAGE = 0 # setsession:一个可选的SQL命令列表用于准备每一个会话,如["set datestyle to german", ...] DB_SET_SESSION = None # 是否使用unicode编码 DB_USE_UNICODE = True
封装的mysqlhelp.py