用python實現一個最簡單版本的mysql資料庫連線池
阿新 • • 發佈:2021-07-21
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的連線,是因為取決於執行緒業務執行的速度。
程式進行中,連線數飆升:
程式執行結束,連線數迴歸正常
暗夜之中,才見繁星;危機之下,暗藏轉機;事在人為,為者常成。