背景
- 在用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 <