1. 程式人生 > >python 基礎 9.5 數據庫連接池

python 基礎 9.5 數據庫連接池

行數據 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 數據庫連接池