那里!
我使用PgBouncer
和Sqlalchemy
来获取连接。
就我的理解而言,我想澄清以下几点:
-
我使用sqlalchemy默认池(
QueuePool
)并从我的pgbouncer获取连接。事务完成后,连接是返回到我这边的"lazy"
连接存储器(sqlalchemy
)还是直接返回到pgbouncer pool
? -
如果我使用带有
pool_size=5
参数的QueuePool
并为pgbouncer
池创建引擎,那么pgbouncer
是一次分配这5个连接,还是按需提供连接? -
如果我删除了连接池(使用
NullPool
),并为pgbouncer
创建了一个引擎,这是否意味着在退出事务上下文后,连接将关闭,并且在下一个请求时将在pgbouncer
内创建一个新的连接? -
在使用
sqlalchemy + pgbouncer
的情况下,以下哪种方法更正确?
通过连接,我的工作方式如下:
async with async_session() as connect:
yield connect
await connect.commit()
我认为如果你使用pgbouncer,你不需要应用内连接池,你可以使用NullPool+QueuePool的pgbouncer+use_lifo=True
标志来使用LIFO队列,它应该首先重用旧连接。不过,我不完全确定同时使用pgbouncer+应用内连接池是有益还是有害。
以下是相关文档链接:https://docs.sqlalchemy.org/en/20/core/pooling.html
同样,对于自动事务提交,您可以使用sessionmaker.begin()
:
async with async_sessinomaker.begin() as session:
...