Python数据库连接池DBUtils
生活随笔
收集整理的這篇文章主要介紹了
Python数据库连接池DBUtils
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DBUtils是Python的一個用于實現數據庫連接池的模塊
此連接池有兩種連接模式:
??? DBUtils提供兩種外部接口:
??? PersistentDB :提供線程專用的數據庫連接,并自動管理連接。
??? PooledDB :提供線程間可共享的數據庫連接,并自動管理連接。
模式一
為每個線程創建一個連接,線程即使調用了close方法,也不會關閉,只是把連接重新放到連接池,供自己線程再次使用。當線程終止時,連接自動關閉
from DBUtils.PersistentDB import PersistentDB import pymysql POOL = PersistentDB(creator=pymysql, # 使用鏈接數據庫的模塊maxusage=None, # 一個鏈接最多被重復使用的次數,None表示無限制setsession=[], # 開始會話前執行的命令列表。ping=0,# ping MySQL服務端,檢查是否服務可用。closeable=False,# 如果為False時, conn.close() 實際上被忽略,供下次使用,再線程關閉時,才會自動關閉鏈接。如果為True時, conn.close()則關閉鏈接,那么再次調用pool.connection時就會報錯,因為已經真的關閉了連接(pool.steady_connection()可以獲取一個新的鏈接)threadlocal=None, # 本線程獨享值得對象,用于保存鏈接對象,如果鏈接對象被重置host='127.0.0.1',port=3306,user='root',password='123456',database='test',charset='utf8' )def func():conn = POOL.connection(shareable=False)cursor = conn.cursor()cursor.execute('select * from user')result = cursor.fetchall()print(result)cursor.close()conn.close() if __name__ == '__main__':func()模式二
模式二:創建一批連接到連接池,供所有線程共享使用。
import pymysqlfrom DBUtils.PooledDB import PooledDB POOL = PooledDB(creator=pymysql, # 使用鏈接數據庫的模塊maxconnections=6, # 連接池允許的最大連接數,0和None表示不限制連接數mincached=2, # 初始化時,鏈接池中至少創建的空閑的鏈接,0表示不創建maxcached=5, # 鏈接池中最多閑置的鏈接,0和None不限制maxshared=3, # 鏈接池中最多共享的鏈接數量,0和None表示全部共享。PS: 無用,因為pymysql和MySQLdb等模塊的 threadsafety都為1,所有值無論設置為多少,_maxcached永遠為0,所以永遠是所有鏈接都共享。blocking=True, # 連接池中如果沒有可用連接后,是否阻塞等待。True,等待;False,不等待然后報錯maxusage=None, # 一個鏈接最多被重復使用的次數,None表示無限制setsession=[], # 開始會話前執行的命令列表。ping=0,# ping MySQL服務端,檢查是否服務可用。host='127.0.0.1',port=3306,user='root',password='123456',database='test',charset='utf8' )def func():# 檢測當前正在運行連接數的是否小于最大鏈接數,如果不小于則:等待或報raise TooManyConnections異常# 否則# 則優先去初始化時創建的鏈接中獲取鏈接 SteadyDBConnection。# 然后將SteadyDBConnection對象封裝到PooledDedicatedDBConnection中并返回。# 如果最開始創建的鏈接沒有鏈接,則去創建一個SteadyDBConnection對象,再封裝到PooledDedicatedDBConnection中并返回。# 一旦關閉鏈接后,連接就返回到連接池讓后續線程繼續使用。conn = POOL.connection()# print(th, '鏈接被拿走了', conn1._con)# print(th, '池子里目前有', pool._idle_cache, '\r\n')cursor = conn.cursor()cursor.execute('select * from user')result = cursor.fetchall()print(result)conn.close()if __name__ == '__main__':func()轉載于:https://www.cnblogs.com/xuecaichang/p/10407899.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python数据库连接池DBUtils的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maya视图切换快捷键(maya切换视角
- 下一篇: python风流史