peewee中connect与connection的区别及连接池使用疑问
Peewee连接池常见问题解答
1. 带+pool的URL调用connect后,db是单个连接还是连接池?
这时候db是连接池实例(比如对应PostgreSQL的PooledPostgresqlDatabase),不是单个连接。peewee的db_url.connect()会识别URL中的+pool后缀,自动初始化带连接池的数据库对象,而非普通单连接对象。
2. Flask多线程应用中如何获取独立连接?用connect还是connection?
- 直接使用
db.connection()方法获取连接,不要重复调用connect()。 - 原因:
connect()是用来初始化数据库连接/池的全局方法,重复调用会重新创建连接池(或单连接),完全没必要,还会浪费资源。connection()是连接池的内置方法,会自动从池中分配一个可用连接给当前线程(请求),Flask的多线程请求场景下,每个线程会拿到独立的连接;请求结束后调用db.close()就能把连接归还到池里,供后续请求复用。
- 示例(Flask请求收尾处理):
from flask import Flask from playhouse.db_url import connect app = Flask(__name__) db = connect('postgresql+pool://...?max_connections=20&stale_timeout=300') @app.teardown_appcontext def teardown_db(error): # 请求结束后归还连接到池 db.close()
3. 每次执行db = connect(db_url)会创建新的独立池吗?
是的,每次调用connect(db_url)都会生成一个全新的连接池实例。所以正确做法是全局只初始化一次db对象,在整个应用生命周期内复用这个池,避免创建多个池导致资源浪费。
4. 调用db.close_all()会关闭所有已打开的连接吗?
是的,close_all()会关闭连接池中所有已建立的连接。注意要在应用 shutdown 阶段调用,确保此时没有活跃的请求正在使用连接,否则可能引发数据库操作错误。
内容的提问来源于stack exchange,提问作者SkyWalker
相关产品推荐
相关产品推荐

