python基础模块 关于有效利用mysql连接,避免线程池数量过多-mysql线程池PooledDB

13 篇文章 0 订阅
  • 起因:1,有一个web服务每一个请求都会进行mysql操作,操作完线程又会断开连接,故想优化一下,减少web连接mysql那一下浪费的时间
    2, 线程时每个线程占用一个数据库连接(其实中间进行数据库操作有间隔,但是没有释放,所以相当于是一个数据库占用 一个)导致连接数过多
  • 经过: 上Google搜索了python的线程池,然后再自己进行了一个简单的装饰器的封装,保证适应以上两种场景
  • 体会: 自己封的东西就是好用!!!! 另外,代码中有写到一个关于数据库连接池大小的设定,大家可以自己看一下我参考的参考的那篇文章
  • 代码如下:
# -*- coding: UTF-8 -*-
"""
模块功能:
1,降低频繁连接mysql的开销
2,避免多线程时每个线程占用一个数据库连接导致连接数过多

适用场景:
1, 多线程频繁启动关闭,需要操作数据库
2, 如果应用程序需要频繁的使用恒定数量的数据库连接,使用PersistentDB会更加稳定高效。
    如果应用程序频繁启动并结束线程,数据库连接的数量总数不能确定的,应该使用PooledDB。PooledDB还将允许一些微小的动态调整。
PS:
0, MYSQL_DB_CONF是一些数据库的配置文件
1、执行带参数的SQL时,请先用sql语句指定需要输入的条件列表,然后再用tuple/list进行条件批配
2、在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别
3、在输入的值中不需要使用转意函数,系统会自动处理

附简书关于mysql连接池设置相关文章地址:
https://www.jianshu.com/p/a8f653fc0c54
总结 数据库连接池大小=CPU核心数 * 2 + 硬盘数量
"""
import time

import pymysql
from pymysql.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
from config import MYSQL_DB_CONF_TEST as MYSQL_DB_CONF


class MysqlPool(object):
    """
    MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现获取连接对象:conn = Mysql.getConn()
            释放连接对象;conn.close()或del conn
    """
    # 连接池对象
    __pool = None

    @staticmethod
    def getConn():
        """
        @summary: 静态方法,从连接池中取出连接
        @return pymysql.connection
        """
        if MysqlPool.__pool is None:
            MysqlPool.__pool = PooledDB(creator=pymysql, mincached=15, maxcached=100,
                                        host=MYSQL_DB_CONF["host"], port=MYSQL_DB_CONF["port"],
                                        user=MYSQL_DB_CONF["user"],
                                        passwd=MYSQL_DB_CONF["passwd"],
                                        db=MYSQL_DB_CONF["db"], use_unicode=False, charset=MYSQL_DB_CONF["charset"],
                                        cursorclass=DictCursor,autocommit=True)
        return MysqlPool.__pool.connection()


def sql_pool(func):
    '''
    为下面的函数进行装饰,保证他们在使用完数据库连接后即可释放回数据连接池

    :param func: 数据库操作函数
    :return:
    '''

    def wrapper(*args, **kw):
        con = MysqlPool.getConn()
        cursor = con.cursor()
        func(cursor, *args, **kw)
        con.cursor.close()
        con.close()

    return wrapper


@sql_pool
def query(cursor, sql, param=None):
    """
    @summary: 执行查询,并取出所有结果集
    @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
    @param param: 可选参数,条件列表值(元组/列表)
    @return: result list(字典对象)/boolean 查询到的结果集
    """
    print sql
    if param is None:
        count = cursor.execute(sql)
    else:
        count = cursor.execute(sql, param)
    if count > 0:
        result = cursor.fetchall()
    else:
        result = False
    return result


@sql_pool
def update(cursor, sql, param=None):
    """
    @summary: 更新数据表记录
    @param sql: SQL格式及条件,使用(%s,%s)
    @param param: 要更新的  值 tuple/list
    @return: count 受影响的行数
    """

    if param is None:
        result = cursor.execute(sql)
    else:
        result = cursor.execute(sql, param)
    return result


@sql_pool
def insert(cursor, sql, param=None):
    if param is None:
        result = cursor.execute(sql)
    else:
        result = cursor.execute(sql, param)

    return result


if __name__ == '__main__':
    print query("select phone from tb_user")
    # time.sleep(12)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值