環(huán)境python2.7
1.DBUtils.PooledDB 介紹
DBUtils 是一套用于管理數(shù)據(jù)庫(kù)連接池的包,為高頻度高并發(fā)的數(shù)據(jù)庫(kù)訪問(wèn)提供更好的性能,可以自動(dòng)管理連接對(duì)象的創(chuàng)建和釋放芽死。最常用的兩個(gè)外部接口是 PersistentDB 和 PooledDB约谈,前者提供了單個(gè)線程專用的數(shù)據(jù)庫(kù)連接池岛都,后者則是進(jìn)程內(nèi)所有線程共享的數(shù)據(jù)庫(kù)連接池护锤。
DBUtils是一套Python數(shù)據(jù)庫(kù)連接池包,并允許對(duì)非線程安全的數(shù)據(jù)庫(kù)接口進(jìn)行線程安全包裝怒详。DBUtils來(lái)自Webware for Python炉媒。
DBUtils提供兩種外部接口:
- PersistentDB :提供線程專用的數(shù)據(jù)庫(kù)連接,并自動(dòng)管理連接昆烁。
- PooledDB :提供線程間可共享的數(shù)據(jù)庫(kù)連接吊骤,并自動(dòng)管理連接。
實(shí)測(cè)證明 PersistentDB 的速度是最高的静尼,但是在某些特殊情況下白粉,數(shù)據(jù)庫(kù)的連接過(guò)程可能異常緩慢,而此時(shí)的PooledDB則可以提供相對(duì)來(lái)說(shuō)平均連接時(shí)間比較短的管理方式鼠渺。
另外鸭巴,實(shí)際使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)也有所依賴,比如SQLite數(shù)據(jù)庫(kù)只能使用PersistentDB作連接池拦盹。 下載地址:(http://www.webwareforpython.org/downloads/DBUtils/)
2.安裝 DBUtils
pip install DBUtils
3.使用案例
import MySQLdb
from DBUtils.PooledDB import PooledDB
pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='pwd',db='myDB',port=3306) #5為連接池里的最少連接數(shù)
conn = pool.connection() #以后每次需要數(shù)據(jù)庫(kù)連接就是用connection()函數(shù)獲取連接就好了
cur=conn.cursor()
SQL="select * from table1"
r=cur.execute(SQL)
r=cur.fetchall()
cur.close()
conn.close()
PooledDB的參數(shù):
- mincached鹃祖,最少的空閑連接數(shù),如果空閑連接數(shù)小于這個(gè)數(shù)普舆,pool會(huì)創(chuàng)建一個(gè)新的連接
- maxcached恬口,最大的空閑連接數(shù),如果空閑連接數(shù)大于這個(gè)數(shù)沼侣,pool會(huì)關(guān)閉空閑連接
- maxconnections祖能,最大的連接數(shù),
- blocking蛾洛,當(dāng)連接數(shù)達(dá)到最大的連接數(shù)時(shí)养铸,在請(qǐng)求連接的時(shí)候,如果這個(gè)值是True轧膘,請(qǐng)求連接的程序會(huì)一直等待钞螟,直到當(dāng)前連接數(shù)小于最大連接數(shù),如果這個(gè)值是False扶供,會(huì)報(bào)錯(cuò)筛圆,
- maxshared 當(dāng)連接數(shù)達(dá)到這個(gè)數(shù),新請(qǐng)求的連接會(huì)分享已經(jīng)分配出去的連接
在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)在:
1.在程序創(chuàng)建連接的時(shí)候碱蒙,可以從一個(gè)空閑的連接中獲取,不需要重新初始化連接夯巷,提升獲取連接的速度
2.關(guān)閉連接的時(shí)候赛惩,把連接放回連接池,而不是真正的關(guān)閉趁餐,所以可以減少頻繁地打開和關(guān)閉連接