python 基礎 9.5 數據庫連接池
阿新 • • 發佈:2017-11-22
行數據 image har lin charset 兩種 reat 產生 span
一. 數據庫連接池
python 編程中可以使用MySQLdb 進行數據庫的連接及諸如查詢,插入,更新等操作,但是每次連接mysql 數據庫請求時,都是獨立的去請求訪問,相當浪費資源,而且訪問數量達到一定書力量時,對mysql的性能會產生較大的影響。因此,實際使用中,通常會使用數據庫的連接池技術,來訪問數據庫達到資源復用的目的。
python 的數據庫連接池包 DBUtils:
DBUtils 是一套python 數據庫連接池包,並允許對非線程安全的數據庫接口進行線程安全包裝。DBUtils 來自 Webware for pthon
DBUtils 提供兩種外部接口:
* PersistentDB:提供線程專用的數據庫連接,並自動管理連接。
*PooledDB: 提供線程間可共享的數據庫連接,並自動管理連接。
下載地址:https://pypi.python.org/pypi/DBUtils/ 下載解壓後,使用python setup.py install 命令進行安裝
或者使用:pip install DBUtils
#/usr/bin/python
#-*- coding:utf-8 -*-
#@Time :2017/11/22 15:43
#@Auther :liuzhenchuan
#@File :數據庫連接池.py
import MySQLdb
from DBUtils.PooledDB import PooledDB
db_config= {
‘host‘:‘192.168.10.199‘,
‘port‘:3306,
‘user‘:‘root‘,
‘passwd‘:‘123123‘,
‘db‘:‘python‘,
‘charset‘:‘utf8‘
}
pool = PooledDB(creator=MySQLdb,mincached=5,blocking=True,**db_config)
if __name__ == ‘__main__‘:
cnx = pool.connection()
cus = cnx.cursor()
SQL = ‘select *from test;‘
try:
cus.execute(SQL)
result = cus.fetchall()
print result
cus.close()
cnx.commit
except Exception as e:
raise e
finally:
cnx.close()
>>>
((100L,), (99L,), (95L,), (95L,), (98L,), (97L,), (96L,), (95L,), (100L,), (101L,), (102L,), (103L,), (104L,), (105L,), (106L,), (107L,), (108L,), (109L,), (110L,), (111L,), (112L,), (113L,), (114L,), (115L,), (116L,), (117L,), (118L,), (119L,), (120L,), (121L,), (122L,), (123L,), (124L,), (125L,), (126L,), (127L,), (128L,), (129L,))
參數說明:
pool = PooledDB(MySQLdb,5, **db_config) #5 為連接池裏的最少連接數
cnx = pool.connection() # 以後每次需要數據庫連接就是用connection() 函數獲取連接就好了
cus = cnx.cursor()
cus = cnx.cursor()
SQL = ‘select *from test;‘
try:
cus.execute(SQL)
result = cus.fetchall()
print result
cus.close()
cnx.commit
PooledDB 的參數:
1.mincached,最少的空閑連接數,如果空閑連接數小於這個數,pool 會創建一個新的連接
2.maxcached,最大的空閑連接數,如果空閑連接數大於這個數,pool 會關閉空閑連接
3.maxconnections,最大的連接數。
4.blocking,當鏈接數達到最大的鏈接數時,在請求連接的時候,如果這個值是True,請求連接的程序會一直等待,直到當前連接數小於最大連接數,如果這個值是Flase,會報錯
5.maxshared 當連接數達到這個數,新請求的鏈接會分享已經分配出去的鏈接。
在uwsgi 中,每個httpd請求都會分發給一個進程,連接池中配置的鏈接數都是一個進程為單位的(即上面的最大連接數,都是在一個進程中的鏈接數),而如果業務中,一個httpd請求中需要的sql連接數不是很多的話(其實大多數都只需要創建一個連接),配置的鏈接數配置都不需要太大。
連接池對性能的提升變現在:
1.在程序創建連接的時候,可以從一個空閑的鏈接中獲取,不需要重新初始化連接,提升獲取鏈接的速度
2.關閉連接的時候,把鏈接放回連接池,而不是真的關閉,所以可以減少頻繁的打開和關閉連接
python 基礎 9.5 數據庫連接池