1. 程式人生 > >python之資料庫連線池.md

python之資料庫連線池.md

帶著問題做學問

之前只是聽說過資料庫連線池,但是還沒有真正的使用過。專案之初,只是簡單的利用pymysql做資料庫的一些操作,隨著專案的進行發現程式程序還在,但資料庫的連線已被關閉(超過一定時間後,資料庫連線會自動關閉),帶著這個問題,通過諮詢和查詢資料,於是有了本篇。

資料庫連線池的作用

資料庫連線池能在系統初始化的時候建立一定數量(具體數量由配置檔案決定)的資料庫連線,並維護這些連線在記憶體中,當用戶訪問時,可以快速的提供一個空閒連線(連線在初始化時已建好,省時)使用者使用完畢,連線重新迴歸連線池。可通過配置檔案修改連線池的初始連線數、最大空閒時間、使用次數等。

DBUtils

DBUtils是一套Python資料庫連線池包,可以使你很方便的使用資料庫連線池而不必自己搭建。 下載地址:

DBUtils, 也可以使用pip方法安裝。

pip install DBUtils

建立一個數據庫連線池

具體程式碼如下:

import pymysql
from DBUtils.PooledDB import PooledDB
import json
import os

class DBPool(object):
    __pool = None

    def __init__(self):  # 建構函式,建立資料庫連線
        self.conn = DBPool.getmysqlconn(self)
        self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)


    def get_config(self, file_name="db_config"):
        path = os.getcwd()  # 獲取當前工作目錄
        with open(path +'\DB_pool\\' + file_name, "r", encoding='utf8') as f:
            config = json.load(f)
        return config

    @staticmethod
    def getmysqlconn(self):
        conf = self.get_config()
        if DBPool.__pool is None:
            __pool = PooledDB(creator=pymysql,
                              mincached=conf['db_pool']['mincached'],
                              maxcached=conf['db_pool']['maxcached'],
                              maxshared=conf['db_pool']['maxshared'],
                              maxconnections=conf['db_pool']['maxconnections'],
                              blocking=conf['db_pool']['blocking'],
                              maxusage=conf['db_pool']['maxusage'],
                              setsession=None,
                              host=conf['db']['host'],
                              port=conf['db']['port'],
                              user=conf['db']['user'],
                              passwd=conf['db']['password'],
                              db = conf['db']['database'],
                              charset=conf['db']['charset']
                              )
        return __pool.connection()

    def get_data(self, sql):
        """
        查詢
        :param sql:
        :return:
        """
        self.cur.execute(sql)
        result = self.cur.fetchall()
        return result

    def modify(self, sql, args):
        try:
            num = self.cur.executemany(sql, args)
            self.conn.commit()
            return num
        except Exception as e:
            self.conn.rollback()

    def dispose(self):  # 關閉連線
        self.cur.close()
        self.conn.close()


if __name__=='__main__':

    ad = DBPool()
    sql = ''
    # sql_ = ""

    sql_args = []
    result = ad.get_data(sql)
    # num = ad.modify(sql_, [sql_args])
    print(result)


配置檔案如下:

{
  "db":{
    "host":"localhost",
    "port":3306,
    "user":"root",
    "password":"root",
    "database":"test",
    "charset":"utf8"
  },
  "db_pool":{
    "mincached":2,
    "maxcached":10,
    "maxshared":10,
    "maxconnections":10,
    "blocking":1,
    "maxusage":0
  }
}

具體引數的含義:

mincached :啟動時開啟的空連線數量 maxcached :連線池最大可用連線數量 maxshared :連線池最大可共享連線數量 maxconnections :最大允許連線數量 blocking :達到最大數量時是否阻塞 maxusage :單個連線最大複用次數 setsession :用於傳遞到資料庫的準備會話

參考