Python實現Mysql資料庫連接池

來源:互聯網
上載者:User

標籤:情況   nts   網站   blank   false   ram   串連池   操作   複用   

python串連Mysql資料庫:

Python編程中可以使用MySQLdb進行資料庫的串連及諸如查詢/插入/更新等操作,但是每次串連MySQL資料庫請求時,都是獨立的去請求訪問,相當浪費資源,而且訪問數量達到一定數量時,對mysql的效能會產生較大的影響。因此,實際使用中,通常會使用資料庫的串連池技術,來訪問資料庫達到資源複用的目的。

python的資料庫連接池包 DBUtils:

 

DBUtils是一套Python資料庫連接池包,並允許對非安全執行緒的資料庫介面進行安全執行緒封裝。DBUtils來自Webware for Python。

DBUtils提供兩種外部介面:
  • * PersistentDB :提供線程專用的資料庫連接,並自動管理串連。
  • * PooledDB :提供線程間可共用資料庫串連,並自動管理串連。

需要的python庫:
下載DBUtils:
Webware 的網站下載最新版本:http://www.webwareforpython.org/downloads/DBUtils/
或者在Python Package Index來下載:http://www.python.org/pypi/DBUtils/

下載pymssql:
http://code.google.com/p/pymssql/downloads/list
(pymssql 是Python語言用來串連微軟 SQL SERVER 資料庫的類庫)



1.寫一個建立串連池,擷取串連以及重新串連資料庫的模組:

# libby_db_pool.py
# 代碼如下:


#-*- coding:utf-8 -*-
from DBUtils.PooledDB import PooledDB
import pymssql #sqlserver資料庫適配器

from pymssql import OperationalError, InternalError, ProgrammingError

HOST = "127.0.0.1"
PORT = "1433"
CHARSET = "utf8"
NAME = "zkeco_oracle"
USER = "sa"
PASSWORK = "sa"



conn_args = {
    ‘host‘:"%s"%HOST,
    ‘port‘:"%s"%PORT,
    ‘database‘:"%s"%NAME,
    ‘charset‘:"%s"%CHARSET,
    ‘user‘:"%s"%USER,
    ‘password‘:"%s"%PASSWORK
}

"""
    mincached : 啟動時開啟的閑置串連數量(預設值 0 以為著開始時不建立串連)
    maxcached : 串連池中允許的閑置的最多串連數量(預設值 0 代表不閑置串連池大小)
    maxshared : 共用串連數允許的最大數量(預設值 0 代表所有串連都是專用的)如果達到了最大數量,被請求為共用的串連將會被共用使用
    maxconnecyions : 建立串連池的最大數量(預設值 0 代表不限制)
    blocking : 設定在串連池達到最大數量時的行為(預設值 0 或 False 代表返回一個錯誤<toMany......>; 其他代表阻塞直到串連數減少,串連被分配)
    maxusage : 單個串連的最大允許複用次數(預設值 0 或 False 代表不限制的複用).當達到最大數時,串連會自動重新串連(關閉和重新開啟)
    setsession : 一個可選的SQL命令列表用於準備每個會話,如["set datestyle to german", ...]

"""

args = (10,10,30,100,True,0,None)

class DbManager():
    def __init__(self):
        try:
            self._pool = PooledDB(pymssql,*args,**conn_args)
        except Exception,e:
            print "The parameters for DBUtils is:",conn_args
    def _getConn(self):
        return self._pool.connection()
    
_dbManager = DbManager()

def getConn():
    """ 擷取資料庫連接 """
    return _dbManager._getConn()

def _reConn():
    """ 重新串連資料庫 """
    global _dbManager
    re = False
    try:
        _dbManager = DbManager()
        re = True
    except:
        import traceback
        traceback.print_exc()
    finally:
        return re
import datetime

def reConn():
    print "%s: now try to reconnect Database!"%(datatime.datatime.now())
    flag = _reConn()
    if flag:
        print "%s reconnect database success!"%(datatime.datatime.now())
    else:
        print "%s reconnect database failed!"%(datatime.datatime.now())



2.寫一個支援增刪查改功能的串連池模組:

#libby_sql_utils.py
#代碼如下:


#-*- coding:utf-8 -*-
from libby_db_pool import getConn,reConn
from libby_db_pool import OperationalError, InternalError, ProgrammingError
import traceback
def test_conn():
    """
        測試連接池串連是否正常
        return:
        res:True:正常,False:不正常
        msg:如果不正常,為異常資訊
    """
    
    test_sql = """
        select 1
    
    """
    
    conn = None
    cur = None
    res = False
    msg = ""
    try:
        conn = getConn()
        cur = conn.cursor()
        cur.execute(test_sql)
        res = cur.fetchall()
        res = True
    except Exception,e:
        trackback.print_exc()
        msg = e
    finally:
        if cur:
            cur.close()
        if conn:
            conn.close()
        return res,msg


def call_reConn():
    """
        重新建立串連池
    """
    reConn()
    
def p_query(sql):
    """
        dbutils 資料連線池
            只能執行資料查詢sql語句,否則會拋錯
        @parm: 要執行的sql語句
        @return:
            []:查詢結果為空白
            None:sql語句執行失敗,出現異常
                    二維list:正常結果
    """
    
    conn = None
    cur = None
    res = None
    try:
        conn = getConn()
        cur = conn.cursor()
        cur.execute(sql)
        res = cur.fetchall()
    except (OperationalError, InternalError):
        call_reConn()
        trackback.print_exc()
    except:
        trackback.exc()
    finally:
        if cur:
            cur.close()
        if conn:
            conn.close()
        return res

def p_query_one(sql):
    """
        dbutils 資料連線池
                只能執行資料查詢sql語句,否則會報錯
                執行sql查詢語句,擷取第一條記錄
        @parm:要執行的sql語句
        @return:
            []:查詢結果為空白
            None:sql語句執行失敗,出現異常
            list:正常結果
    """
    
    conn = None
    cur = None
    res = None
    try:
        conn = getConn()
        cur = conn.cursor()
        cur.execute(sql)
        res = cur.fetchone()
    except (OperationalError,InternalError):
        call_reConn()
    except:
        traceback.print_exc()
    finally:
        if cur:
            cur.close()
        if conn:
            conn.close()
        return res



def p_execute(sql):
    """
        dbutils 資料連線池
                執行資料動作陳述式,包括 update,insert,delete
        @parm:要執行的sql
        @return:
            None:sql語句執行失敗,出現異常
            number:影響記錄條數
            -2:資料庫連接失敗導致執行失敗
    """
    conn = None
    cur = None
    res = None
    try:
        conn = getConn()
        cur = conn.cursor()
        cur.execute(sql)
        res = cur._cursor.rowcount
        conn.commit()
    except Exception,e:
        if conn:
            conn.rollback()
        traceback.print_exc()
    finally:
        if res == -1:#可能是資料庫中斷連線
            ret,msg = test_conn()
            if not ret:
                call_reConn()
                res = -2
        if cur:
            cur.close()
        if conn:
            conn.close()
        return res
    


def p_mutiexec(sql_list):
    """
        dbutils 資料連線池
                執行多條資料動作陳述式,可以用於多條sql語句的事務性操作,包括 update,insert,delete
        
        @parm:要執行的sql語句[]
        @return:
            (flag,res):
                flag<Ture or False>:批次是否全部執行成功
                res<list>:每天sql語句執行影響的行數,如果執行失敗,由此可以判斷第幾條sql語句執行失敗
                            如果遇到資料庫斷開的情況,返回[-2,]
    
    """
    
    conn = None
    cur = None
    res = []
    flag = True
    
    try:
        conn = getConn()
        cur = conn.cursor()
        for sql in sql_list:
            cur.execute(sql)
            num = cur._cursor.rowcount
            res.append(num)
        conn.commit()
    except Exception,e:
        if conn:
            conn.rollback()
        traceback.print_exc()
    finally:
        if -1 in res:
            ret,msg = test_conn()
            if not ret:
                call_reConn()
                flag = False
                res = [-2,]
        if cur:
            cur.close()
        if conn:
            conn.close()
        return flag,res

Python實現Mysql資料庫連接池

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.