PyMySQL连接池

背景

  • 在用python写后端服务时候,需要与mysql数据库进行一些数据查询或者插入更新等操作。启动服务后接口运行一切正常,
    隔了第二天去看服务日志就会报错,问题如下:
pymysql.err.OperationalError: (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))")
  • MySQL默认的wait_timeout时间28800秒,即8小时,超过8小时,MySQL就会放弃连接。MySQL默认设置的时间是8小时,可以通过运行show variables like ‘%timeout%’;这个SQL即可查看到,时间根据自己业务而定。
  • 对于数据库连接,一般不建议使用全局变量,在每次操作完成后即关闭连接。这是因为长时间保持数据库连接会对性能和资源消耗产生负面影响。与此相反,使用数据库连接池来维护和分配数据库连接是更好的做法。

好处

连接池的优点是可以在多个线程或进程之间共享,并且可以有效地管理连接数,而无需手动打开和关闭连接。

常用包

  • QueuePool 是 SQLAlchemy 内置的一个连接池实现,它可以管理一个连接队列,确保每个连接在使用后被适当地关闭。该池使用Python 自带的 queue 模块实现,并支持可配置的最大连接数、预处理语句等特性。优点是易于使用,无需其他依赖,并与SQLAlchemy 之间无缝集成。
  • PooledDB 是 DBUtils 库提供的一个连接池实现,可以与 SQLAlchemy 或其他 Python数据库库一起使用。它支持多种类型的连接池,并使用 threading模块实现线程安全,具有更高的性能和稳定性。该库还提供了一些方便的功能,例如自动回收空闲连接等。

pip install dbutils==1.3 

DBUtils python 代码

import os
import pymysql
import configparser
from DBUtils.PooledDB import PooledDB

def get_mysql_config():
	MODULE_REAL_DIR = os.path.dirname(os.path.realpath(__file__))
	
	config = configparser.ConfigParser()
	config.read(MODULE_REAL_DIR + '/../conf/config.conf')
	
	host = config.get('MYSQL_FORMAL_DB', '127.0.0.1')
	port = config.get('MYSQL_FORMAL_DB', '3306')
	user = config.get('MYSQL_FORMAL_DB', 'root')
	pwd = config.get('MYSQL_FORMAL_DB', 'mypwd')
	db = config.get('MYSQL_FORMAL_DB', 'mydb')
	return host, port,user, password, database
	
host, port, user, password, database = get_mysql_config()

class MySQLConnectionPool:

    def __init__(self,):
        self.pool <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值