Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能
Python 編程中可以使用 PyMysql 進(jìn)行數(shù)據(jù)庫(kù)的連接及諸如查詢/插入/更新等操作,但是每次連接 MySQL 數(shù)據(jù)庫(kù)請(qǐng)求時(shí),都是獨(dú)立的去請(qǐng)求訪問(wèn),相當(dāng)浪費(fèi)資源,而且訪問(wèn)數(shù)量達(dá)到一定數(shù)量時(shí),對(duì) mysql 的性能會(huì)產(chǎn)生較大的影響。因此,實(shí)際使用中,通常會(huì)使用數(shù)據(jù)庫(kù)的連接池技術(shù),來(lái)訪問(wèn)數(shù)據(jù)庫(kù)達(dá)到資源復(fù)用的目的。
解決方案:DBUtils
DBUtils 是一套 Python 數(shù)據(jù)庫(kù)連接池包,并允許對(duì)非線程安全的數(shù)據(jù)庫(kù)接口進(jìn)行線程安全包裝。DBUtils 來(lái)自 Webware for Python 。
原理:

- 在程序創(chuàng)建連接的時(shí)候,可以從一個(gè)空閑的連接中獲取,不需要重新初始化連接,提升獲取連接的速度
- 關(guān)閉連接的時(shí)候,把連接放回連接池,而不是真正的關(guān)閉,所以可以減少頻繁地打開(kāi)和關(guān)閉連接
例子
import pymysql from DBUtils.PooledDB import PooledDB pool = PooledDB(pymysql,5,host='ip',user='user',passwd='passwd',db='db',port=3306,setsession=['SET AUTOCOMMIT = 1']) # 5為連接池里的最少連接數(shù),setsession=['SET AUTOCOMMIT = 1']是用來(lái)設(shè)置線程池是否打開(kāi)自動(dòng)更新的配置,0為False,1為True conn = pool.connection() #以后每次需要數(shù)據(jù)庫(kù)連接就是用connection()函數(shù)獲取連接就好了 cur=conn.cursor() SQL="select * from table" count=cur.execute(SQL) results=cur.fetchall() cur.close() conn.close()
PooledDB 的參數(shù):
POOL = PooledDB( creator=pymysql, # 使用鏈接數(shù)據(jù)庫(kù)的模塊 maxconnections=6, # 連接池允許的最大連接數(shù),0和None表示不限制連接數(shù) mincached=2, # 初始化時(shí),鏈接池中至少創(chuàng)建的空閑的鏈接,0表示不創(chuàng)建 maxcached=5, # 鏈接池中最多閑置的鏈接,0和None不限制 maxshared=1, # 鏈接池中最多共享的鏈接數(shù)量,0和None表示全部共享。PS: 無(wú)用,因?yàn)閜ymysql和MySQLdb等模塊的 threadsafety都為1,所有值無(wú)論設(shè)置為多少,_maxcached永遠(yuǎn)為0,所以永遠(yuǎn)是所有鏈接都共享。 blocking=True, # 連接池中如果沒(méi)有可用連接后,是否阻塞等待。True,等待;False,不等待然后報(bào)錯(cuò) maxusage=None, # 一個(gè)鏈接最多被重復(fù)使用的次數(shù),None表示無(wú)限制 setsession=[], # 開(kāi)始會(huì)話前執(zhí)行的命令列表。如:[“set datestyle to …”, “set time zone …”] ping=0, # ping MySQL服務(wù)端,檢查是否服務(wù)可用。 # 如: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=‘ziji', charset=‘utf8' )
在 uwsgi 中,每個(gè) http 請(qǐng)求都會(huì)分發(fā)給一個(gè)進(jìn)程,連接池中配置的連接數(shù)都是一個(gè)進(jìn)程為單位的(即上面的最大連接數(shù),都是在一個(gè)進(jìn)程中的連接數(shù)),而如果業(yè)務(wù)中,一個(gè) http 請(qǐng)求中需要的 sql 連接數(shù)不是很多的話(其實(shí)大多數(shù)都只需要?jiǎng)?chuàng)建一個(gè)連接),配置的連接數(shù)配置都不需要太大。
連接池對(duì)性能的提升表現(xiàn)在:
在程序創(chuàng)建連接的時(shí)候,可以從一個(gè)空閑的連接中獲取,不需要重新初始化連接,提升獲取連接的速度關(guān)閉連接的時(shí)候,把連接放回連接池,而不是真正的關(guān)閉,所以可以減少頻繁地打開(kāi)和關(guān)閉連接
總結(jié)
以上所述是小編給大家介紹的Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
python re正則表達(dá)式模塊(Regular Expression)
Python 的 re 模塊(Regular Expression 正則表達(dá)式)提供各種正則表達(dá)式的匹配操作,在文本解析、復(fù)雜字符串分析和信息提取時(shí)是一個(gè)非常有用的工具.2014-07-07
利用python清除移動(dòng)硬盤中的臨時(shí)文件
本篇文章的目的是在移動(dòng)硬盤插入到電腦的同時(shí),利用Python自動(dòng)化和Windows服務(wù)刪除掉這些臨時(shí)文件。感興趣的朋友可以了解下2020-10-10
Python中元組的基礎(chǔ)介紹及常用操作總結(jié)
元組是一種不可變序列。元組變量的賦值要在定義時(shí)就進(jìn)行,這就像C語(yǔ)言中的const變量或是C++的引用,定義時(shí)賦值之后就不允許有修改。元組存在的意義是:元組在映射中可以作為鍵使用,因?yàn)橐WC鍵的不變性。元組作為很多內(nèi)置函數(shù)和方法的返回值存在2021-09-09
Django 后臺(tái)帶有字典的列表數(shù)據(jù)與頁(yè)面js交互實(shí)例
這篇文章主要介紹了Django 后臺(tái)帶有字典的列表數(shù)據(jù)與頁(yè)面js交互實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04

