Flask之數據庫連接池DBuilt
BUtils是Python的一個用於實現數據庫連接池的模塊。
如果沒有連接池,使用pymysql來連接數據庫時,單線程應用完全沒有問題,但如果涉及到多線程應用那麼就需要加鎖,一旦加鎖那麼連接勢必就會排隊等待,當請求比較多時,性能就會降低了。
此連接池有兩種連接模式:
模式一:爲每個線程創建一個連接,線程即使調用了close方法,也不會關閉,只是把連接重新放到連接池,供自己線程再次使用。當線程終止時,連接自動關閉
模式二:創建一批連接到連接池,供所有線程共享使用。
PS:由於pymysql、MySQLdb等threadsafety值爲1,所以該模式連接池中的線程會被所有線程共享。
本文出自https://blog.csdn.net/weixin_30628077/article/details/96887344
MySQL 使用連接池封裝pymysql
一、在utils.py中寫
import pymysql from DBUtils.PooledDB import PooledDB POOL = PooledDB( creator=pymysql, # 使用鏈接數據庫的模塊 maxconnections=6, # 連接池允許的最大連接數,0和None表示不限制連接數 mincached=2, # 初始化時,鏈接池中至少創建的空閒的鏈接,0表示不創建 maxcached=5, # 鏈接池中最多閒置的鏈接,0和None不限制 maxshared=1, # 鏈接池中最多共享的鏈接數量,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='', database='ziji', charset='utf8' ) 二、在sqlhelper.py中寫入:
from utils import POOL import pymysql def create_conn(): conn = POOL.connection() cursor = conn.cursor(pymysql.cursors.DictCursor) return conn, cursor def close_conn(conn, cursor): conn.close() cursor.close() def select_one(sql, args): conn, cur = create_conn() cur.execute(sql, args) result = cur.fetchone() close_conn(conn, cur) return result def select_all(sql, args): conn, cur = create_conn() cur.execute(sql, args) result = cur.fetchall() close_conn(conn, cur) return result def insert_one(sql, args): conn, cur = create_conn() result = cur.execute(sql, args) conn.commit() close_conn(conn, cur) return result def delete_one(sql,args): conn,cur = create_conn() result = cur.execute(sql,args) conn.commit() close_conn(conn,cur) return result def update_one(sql,args): conn,cur = create_conn() result = cur.execute(sql,args) conn.commit() close_conn(conn,cur) return result # sql = "insert into stu(id,name,age) VALUE (%s,%s,%s)" #增加 # res = insert_one(sql, [2,"飛機", 28]) # print(res) # sql = "delete from stu where name = %s" #刪除 # res = delete_one(sql, "哪吒") # print(res) # sql = "select * from stu" #查詢全部 # res = select_all(sql, []) # print(res) # sql = "select * from stu where name=%s" #查詢一條 # res = select_one(sql, "趙振偉") # print(res)