为多个请求重用数据库连接

时间:2016-11-08 04:20:04

标签: python database web-applications flask

如果我不需要事务,我可以为多个请求重用相同的数据库连接吗?

Flask文档says

  

由于数据库连接封装了一个事务,我们还需要确保当时只有一个请求使用该连接。

以下是我理解上述句子的含义:

  

Python DB-API连接一次只能处理一个事务;要启动新事务,必须首先提交或回滚前一个事务。因此,如果我们的每个请求都需要自己的事务,那么当然每个请求都需要自己的数据库连接。

如果我弄错了,请告诉我。

但是,假设我设置了自动提交模式,并在单个SQL语句中处理每个请求。或者,或者,假设我只读 - 不写 - 数据库。在任何一种情况下,似乎我可以为我的所有请求重用相同的数据库连接,以节省多个连接的开销。但我不确定这种方法是否有任何不利因素。

编辑:我可以看到我提议的一个问题:每个请求可能由不同的进程处理。由于连接应该probably not be reused across processes,让我澄清一下我的问题:我的意思是为每个进程创建一个连接,并将其用于所有恰好由此进程处理的请求。

另一方面,(绿色或本机)线程的重点通常是为每个线程提供一个请求,因此我提出的方法意味着跨线程共享连接。似乎是one connection can be used concurrently in multiple native threads,但not in multiple green threads

所以,让我们说具体一点,我的环境是带有多个多线程同步工作者的烧瓶+手枪。

1 个答案:

答案 0 :(得分:1)

基于@Craig Ringer comment on a different question,我想我知道答案。

连接共享的唯一可能优势是性能(其他因素 - 如事务封装和简单性 - 支持每个请求单独连接)。由于无法跨进程或绿色线程共享连接,因此它只有机会使用本机线程。但是psycopg2(可能是其他驱动程序)不允许来自同一连接的并发访问。因此,除非每个请求花费很少时间与数据库通信,否则连接共享可能会影响性能,而不是受益。