Python数据库连接使用Python数据库连接池实例

本文介绍如何使用Python的PooledDB实现数据库连接池,通过复用连接减少资源消耗,提高应用性能。文章详细解释了连接池的工作原理,包括从空闲连接中获取连接、减少频繁的连接创建和关闭,以及在uwsgi环境中配置连接池的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python数据库连接使用,以及Python数据库连接池实例——PooledDB
在uwsgi中,每个http请求都会分发给一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的最大连接数,都是在一个进程中的连接数),而如果业务中,一个http请求中需要的sql连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。
连接池对性能的提升表现在:
1.在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度
2.关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接

# coding:utf-8
# !/usr/bin/env python

import pandas
from DBUtils.PooledDB import PooledDB
import traceback
import MySQLdb

class DBPool():
    __pool = None

    # mysql数据库信息
    __dbconfig = {
        "creator": MySQLdb,
        "maxconnections": 4,  #创建连接池的最大数量
        "mincached": 1,  # 最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
        "maxcached": 2,  # 最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
        "host": "***.***.**.**",
        "port": 3306,
        "user": 'admin',
        "passwd": '*******',
        "blocking": False,  # 当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错,
        "maxusage": 100,  # 单个连接的最大允许复用次数,当达到最大数时,连接会自动重新连接(关闭和重新打开)
        "autocommit": False,  # 是否自动提交事物
        "use_unicode": True,  # 字符编码
        "charset": 'utf8',  # 数据库连接编码
        # "maxshared":**   #当连接数达到这个数,新请求的连接会分享已经分配出去的连接
    }

    def __enter__(self, dbName='bright_ill'):
        self.conn = DBPool.get_connect(dbName)
        self.cursor = self.conn.cursor()
        return self

    @staticmethod
    def get_connect(dbName):
        if DBPool.__pool is None:
            try:
                db_pool = PooledDB(db=dbName, **DBPool.__dbconfig)
                # PooledDB.__version__.split('.')
                # print(db_pool.version)
                 # print(connect success)
                return db_pool.connection()

            except Exception as error:
                traceback.print_exc()
                print "connecting to MySQL pool is Error:%s."%(error)
                return error

        return DBPool.__pool.connection()

    def __exit__(self, type, value, trace):
        self.cursor.close()
        self.conn.close()


def s_query(sql, args=None):
    with DBPool() as db:
        try:
            db.conn.ping()
        except:
            traceback.print_exc()
            ## 数据库超时
            db = MySQLdb.connect(
                host="***.***.**.**", user='***', passwd='***', db='bright_ill'
            )

        cur = db.cursor
        cur.execute(sql, args)
        return cur.fetchall()


def read_sql(sql):
    with DBPool() as db_pool:
        try:
            db_pool.conn.ping()
            db = db_pool.conn
        except:
            traceback.print_exc()
            ## 数据库超时
            db = MySQLdb.connect(
                host="***.***.**.**", user='***', passwd='***', db='bright_ill'
            )

        return pandas.read_sql(sql, db)


def test_read():
    sql = '''SELECT * FROM bright_ill_user'''
    return s_query(sql)
    return read_sql(sql)

if __name__ == '__main__':
    test_read()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值