Python資料庫連線池DBUtils

2022-05-09 23:42:15 字數 3373 閱讀 9417

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...