1. 程式人生 > >flask--數據庫連接池

flask--數據庫連接池

ttr run 連接 threads exec cached urn mys pooled

定義:

創建一個連接池(10個鏈接),為所有線程提供鏈接,使用時來進行獲取,使用完畢時,再次放回到連接池。

等待下次其他線程的調用

單例模式使用連接池

import pymysql
import threading
from DBUtils.PooledDB import PooledDB
class SingletonDBPool(object):
_instance_lock = threading.Lock()  #設置鎖

def __init__(self):
self.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=[], # 開始會話前執行的命令列表。如:["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=‘123‘,
database=‘pooldb‘,
charset=‘utf8‘
)

def __new__(cls, *args, **kwargs):  #當程序初始化之前,會先調用__new__方法.  實現單例模式

if not hasattr(SingletonDBPool, "_instance"):
with SingletonDBPool._instance_lock:
if not hasattr(SingletonDBPool, "_instance"):
SingletonDBPool._instance = object.__new__(cls, *args, **kwargs)
return SingletonDBPool._instance

def connect(self):  #設置連接方法

return self.pool.connection()


調用時

技術分享圖片
from pool import SingletonDBPool

def run():
    pool = SingletonDBPool()
    con = pool.connect()
    # xxxxxx

    con.close()

if __name__ == __main__:
    run()
調用

flask--數據庫連接池