python 單例與數據庫鏈接池 及相關選擇

單例:專業用來處理鏈接多的問題(好比鏈接redis,zookeeper等),全局只有一個對象python

 

單例代碼
def singleton(cls):
    
    instances = {}
    
    def _singleton(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    
    return _singleton

  

實例代碼mysql

from singleton import singleton

#@singleton
class  MysqlOpers:
    
    def __init__(self):
        print('創建mysql鏈接')
        #僞代碼  self.db = MySQLdb.connect()
        
    def select(self):
        pass
    
m = MysqlOpers()
n = MysqlOpers()
c = MysqlOpers()

print(id(m))
print(id(n))
print(id(c))

 

加上單例裝飾器後redis

mysql 鏈接池sql

#coding=utf-8

import traceback

import MySQLdb
from DBUtils.PooledDB import PooledDB


db_pool_ins = None

#須要替換用戶名,密碼等
class DBPool():
    def __init__(self):
        self.pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=10, maxconnections=100, blocking=True, 
                             host= "127.0.0.1", port=3306, user='', passwd='',
                             db='test', charset='utf8',)

    def get_connection(self):
        return self.pool.connection()


class DBAction():
    #鏈接池對象
    def __init__(self):
        #創建和數據庫系統的鏈接
        global db_pool_ins
        if db_pool_ins == None:
            db_pool_ins = DBPool()
        self.conn = db_pool_ins.get_connection()
        #獲取操做遊標
        self.cursor = self.conn.cursor()

    def close_database(self):
        self.cursor.close()
        self.conn.close()

    def data_operate(self, sql, params=()):
        '''
        數據的插入,更新,刪除
        :param database:
        :param sql:
        :return: 成功:0,失敗:1
        '''
        try:
            self.cursor.execute(sql, params)
            self.conn.commit()
            return 0
        except:
            print("sql is %s, params is %s error. %s" % (sql, params, traceback.format_exc()))
            self.conn.rollback()
            raise Exception

    def data_operate_many(self, sql, params=()):
        '''
        數據的插入,更新,刪除
        :param sql:
        :param params:
        :return: 成功:0,失敗:1
        '''
        #執行sql語句
        self.cursor.executemany(sql, params)
        #提交到數據庫執行
        self.conn.commit()

    def data_operate_count(self, sql, params=()):
        '''
        數據的插入,更新,刪除
        :return: 受影響的條數
        '''
        #執行sql語句
        count = self.cursor.execute(sql, params)
        #提交到數據庫執行
        self.conn.commit()
        return count

    def data_inquiry(self, sql, size=10, params=()):
        '''
        :param database:
        :param sql:
        :return: ((),(),...,())
        '''
        self.cursor.execute(sql, params)
        result = self.cursor.fetchmany(size)
        return result

    def data_inquiry_all(self, sql, params=()):
        '''
        :param database:
        :param sql:
        :return: ((),(),...,())
        '''
        self.cursor.execute(sql, params)
        result = self.cursor.fetchall()

        return result

    def commit(self):
        self.conn.commit()

  連接mysql等關係型數據庫,應當採用此方式。確保多鏈接存在。數據庫

相關文章
相關標籤/搜索