dbutils是python的乙個用於實現資料庫連線池的模組,有兩種使用方式
這種方式一般是不推薦使用的,因為與100個執行緒難道還開100個連線。執行緒即使呼叫了close方法,也不會關閉,這裡的close只是把連線重新放到連線池,供自己執行緒再次使用。當執行緒終止時,連線自動關閉。
from flask import flask
from dbutils.persistentdb import persistentdb
import pymysql
import time
pool = persistentdb(
creator=pymysql, # 使用鏈結資料庫的模組
maxusage=none, # 乙個鏈結最多被重複使用的次數,none表示無限制
setsession=, # 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]
ping=0,
# ping mysql服務端,檢查是否服務可用。# 如:0 = none = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
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()
cursor = conn.cursor()
cursor.execute('select * from user')
result = cursor.fetchall()
cursor.close()
conn.close() # 不是真的關閉,而是假的關閉。 conn = pymysql.connect() conn.close()
time.sleep(300)
conn = pool.connection()
cursor = conn.cursor()
cursor.execute('select * from user')
result = cursor.fetchall()
cursor.close()
conn.close()
return 'login'
if __name__ == '__main__':
在這裡使用了time.sleep() 的方式,即使在之前呼叫了 conn.close(), 在windows中通過netstat -ano | findstr 3306
可以發現連線一直保持著
from flask import flask
from dbutils.pooleddb import pooleddb
import pymysql
import time
pool = pooleddb(
creator=pymysql, # 使用鏈結資料庫的模組
maxconnections=6, # 連線池允許的最大連線數,0和none表示不限制連線數
mincached=2, # 初始化時,鏈結池中至少建立的空閒的鏈結,0表示不建立
maxcached=5, # 鏈結池中最多閒置的鏈結,0和none不限制
maxshared=0, # 鏈結池中最多共享的鏈結數量,0和none表示全部共享。ps: 無用,因為pymysql和mysqldb等模組的 threadsafety都為1,所有值無論設定為多少,_maxcached永遠為0,所以永遠是所有鏈結都共享。
blocking=true, # 連線池中如果沒有可用連線後,是否阻塞等待。true,等待;false,不等待然後報錯
maxusage=none, # 乙個鏈結最多被重複使用的次數,none表示無限制
setsession=, # 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]
ping=0,
# ping mysql服務端,檢查是否服務可用。# 如: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='123456',
database='test',
charset='utf8'
)def func():
conn = pool.connection()
cursor = conn.cursor()
cursor.execute('select * from user')
result = cursor.fetchall()
cursor.close()
conn.close() # 不是真的關閉,而是假的關閉。 conn = pymysql.connect() conn.close()
time.sleep(300)
conn = pool.connection()
cursor = conn.cursor()
cursor.execute('select * from user')
result = cursor.fetchall()
cursor.close()
conn.close()
return 'login'
if __name__ == '__main__':
這時候conn.close()會把鏈結放到連線池,下次該執行緒如果還要用就去連線池去拿。看一下原始碼流程,因為maxshared永遠為0,所以
python 資料庫連線池
from dbutils.pooleddb import pooleddb import pymysql pool pooleddb creator pymysql,使用鏈結資料庫的模組 maxconnections 6,連線池允許的最大連線數,0和none表示不限制連線數 mincached 2,...
資料庫連線池 Redis連線池
基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...
資料庫連線池
實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...