1. 程式人生 > 其它 >用python實現一個最簡單版本的mysql資料庫連線池

用python實現一個最簡單版本的mysql資料庫連線池

import time
from threading import Thread

import mysql.connector


class db():
    list = []

    # 每個連線最大使用次數
    useTimes = 10
    # 預設開啟的執行緒數量
    threadNum = 10
    # 獲取連線超時時間(ms)
    maxGetConnTime = 1000
    # mysql配置
    cfg = {'user': 'root', 'password': '', 'host': '127.0.0.1', 'database': 'test'}

    
#初始化連線池 def __init__(self): for i in range(self.threadNum): con = self.connect() self.list.append(con) #獲取連線 def connect(self): cnx = mysql.connector.connect(**self.cfg) cursor = cnx.cursor() return {"cnx": cnx, "cursor": cursor, "
useTime": 0} #從連線池獲取可用連線 def getConn(self): for i in range(self.maxGetConnTime): if (len(self.list) > 0): return self.list.pop(0) time.sleep(0.001) return None #執行具體sql並返回 def execute(self, query, data=()): conn = self.getConn()
if (conn == None): print("無可用連線") return cursor = conn['cnx'].cursor() cursor.execute(query, data) rt = cursor.fetchall() data = [] for x in rt: data.append(dict(zip(cursor.column_names, x))) # 新增欄位名稱 # 關閉遊標 cursor.close() # 預設連線最多使用次數 if (conn['useTime'] < self.useTimes): conn['useTime'] = conn['useTime'] + 1 else: # 關閉連線 conn['cnx'].close() # 補充新的連線 conn = self.connect() self.list.append(conn) # 把連線塞回去 # 返回結果 return data ret = db() def run(): query = ("SELECT * FROM auction " "WHERE id BETWEEN %s AND %s") data = ret.execute(query, (1, 2)) for i in data: print(i) #為了檢視mysql的連線數效果 time.sleep(3) #開啟100個執行緒進行測試 for i in range(100): thread = Thread(target=run, name=run.__name__, args=() # 元組 ) thread.start() time.sleep(1) for i in ret.list: print(i)

執行結果:

可用看到,有2個連線沒有用到10次,然後新建了2個新的連線,銷燬了2個超過10的連線,是因為取決於執行緒業務執行的速度。

程式進行中,連線數飆升:

程式執行結束,連線數迴歸正常

暗夜之中,才見繁星;危機之下,暗藏轉機;事在人為,為者常成。