美文网首页
数据库连接池

数据库连接池

作者: 火鸡不肥 | 来源:发表于2019-03-08 12:08 被阅读0次

    当有多个请求发起,就需要用到数据库连接池

    import pymysql
    from conf import setting
    from DBUtils.PooledDB import PooledDB
    
    POOL = PooledDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
        mincached=6,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
        maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
        maxshared=3,
        # 链接池中最多共享的链接数量,0和None表示全部共享。
        blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
        maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
        setsession=[],  # 开始会话前执行的命令列表。
        ping=0,
        # ping MySQL服务端,检查是否服务可用。
    
        host=setting.host,
        port=setting.port,
        user=setting.user,
        password=setting.password,
        database=setting.database,
        charset=setting.charset,
        autocommit=setting.autocommit
    )
    
    import pymysql
    from ormpool import db_pool
    from threading import current_thread
    
    
    class MysqlPool:
        def __init__(self):
            self.conn = db_pool.POOL.connection()
            # print(db_pool.POOL)
            # print(current_thread().getName(), '拿到连接', self.conn)
            # print(current_thread().getName(), '池子里目前有', db_pool.POOL._idle_cache, '\r\n')
            self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
    
        def close_db(self):
            self.cursor.close()
            self.conn.close()
    
        def select(self, sql, args=None):
            self.cursor.execute(sql, args)
            rs = self.cursor.fetchall()
            return rs
    
        def execute(self, sql, args):
    
            try:
                self.cursor.execute(sql, args)
                affected = self.cursor.rowcount
                # self.conn.commit()
            except BaseException as e:
                print(e)
            finally:
                self.close_db()
            return affected
    

    当然不能每次都请求来开一次数据库连接池,那就没有池的意义了,这就需要用到python中的单例

    from conf import setting
    import pymysql
    
    
    class Mysql:
        __instance = None
        def __init__(self):
            self.conn = pymysql.connect(host=setting.host,
                                        user=setting.user,
                                        password=setting.password,
                                        database=setting.database,
                                        charset=setting.charset,
                                        autocommit=setting.autocommit)
            self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
    
        def close_db(self):
            self.conn.close()
    
        def select(self, sql, args=None):
            self.cursor.execute(sql, args)
            rs = self.cursor.fetchall()
            return rs
    
        def execute(self, sql, args):
            try:
                self.cursor.execute(sql, args)
                affected = self.cursor.rowcount
                # self.conn.commit()
            except BaseException as e:
                print(e)
            return affected
    
        @classmethod
        def singleton(cls):
            if not cls.__instance:
                cls.__instance = cls()
            return cls.__instance
    

    相关文章

      网友评论

          本文标题:数据库连接池

          本文链接:https://www.haomeiwen.com/subject/bttkpqtx.html