我正在阅读 asyncpg
的文档,但我无法理解为什么要使用连接池而不是单个连接。
在给出的示例中,使用了连接池:
async with pool.acquire() as connection:
async with connection.transaction():
result = await connection.fetchval('select 2 ^ $1', power)
return web.Response(
text="2 ^ {} is {}".format(power, result))
但也可以在需要时创建连接来完成:
connection = await asyncpg.connect(user='postgres')
async with connection.transaction():
result = await connection.fetchval('select 2 ^ $1', power)
return web.Response(
text="2 ^ {} is {}".format(power, result))
使用池而不是连接的优点是什么?
pool.acquire()
耗时0.6秒,1000个con.fetchval()
耗时0.15秒。所以acquire()
看起来比fetchval()
贵4倍,或者我想错了? - davidtgqmin_size
和max_size
的值。acquire()
方法会在可用的连接上运行查询之前进行锁定。因此,如果所有的连接都被占用,它会等待至少有一个连接空闲。这样等待的时间比实际工作本身所需的时间更长。你需要调整这些参数以更好地适应你的工作负载。 - winwin