📅  最后修改于: 2023-12-03 15:04:42.140000             🧑  作者: Mango
在 Python 程序中,为了连接数据库或其他服务器,我们通常需要创建连接对象。但是,在一些情况下,频繁创建和销毁连接对象会给我们带来一些负担,如连接池中数量的限制、性能开销等。所以,连接重用就成为了一个非常重要的话题。
常见的解决方案是使用连接池技术,它的主要思想是在程序启动时创建一定数量的连接对象并保存到内存中,当需要连接时,则从连接池中获取一个可用连接。当不再需要该连接时,将其放回连接池,以便其他程序使用。
在 Python 中,我们可以使用一些第三方包来实现连接池,如 DBUtils、SQLAlchemy 等。
以下是使用 DBUtils 连接池的示例代码:
from dbutils.pooled_db import PooledDB
import pymysql
pool = PooledDB(
creator=pymysql, # MySQL 数据库连接库
maxconnections=5, # 连接池中最大连接数
mincached=2, # 初始时,连接池中连接的数量
maxcached=5, # 连接池中允许缓存的最大连接数
maxshared=3, # 连接池中最多共享的连接数量
blocking=True, # 当连接池达到最大数量时,是否阻塞后续请求(False 为抛出异常)
maxusage=None, # 单个连接在使用完后重新放入连接池之前最多被使用多少次,默认无限制
setsession=[], # 会话所需的 SQL 类型列表,在连接对象创建时执行
ping=0, # 每次从连接池中获取连接时,是否自动执行 ping() 操作以检查连接是否正常
host='localhost',
port=3306,
user='root',
password='',
database='test',
charset='utf8mb4'
)
def get_conn():
conn = pool.connection()
return conn
# 获取连接
conn = get_conn()
在连接池中,如果长时间没有使用的连接会被当做空闲连接占用连接池的连接数,从而导致连接池无法提供足够数量的连接给其他程序使用。因此,需要通过设置空闲连接的保留时间或者实现自动归还空闲连接的功能来防止空闲连接。
以下是使用 SQLAlchemy 实现自动归还空闲连接的示例代码:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
engine = create_engine(
'mysql+pymysql://root:@localhost/test',
poolclass=NullPool, # 禁用连接池技术
)
Session = sessionmaker(bind=engine)
def get_session():
session = Session()
return session
# 获取会话
with get_session() as session:
# 查询数据等操作
pass
连接重用是对程序的性能、稳定性和资源的一种优化方式,连接池和空闲连接的处理可以有效避免连接数量过多或者空闲连接导致的问题。