Python 对多个请求重用数据库连接

Python 对多个请求重用数据库连接,python,database,web-applications,flask,Python,Database,Web Applications,Flask,如果我不需要事务,我可以为多个请求重用同一个数据库连接吗 烧瓶文件: 因为数据库连接封装了一个事务,所以我们还需要确保在同一时间只有一个请求使用该连接 以下是我如何理解上述句子的含义: Python DB-API连接一次只能处理一个事务;要启动新事务,必须首先提交或回滚上一个事务。因此,如果每个请求都需要自己的事务,那么当然每个请求都需要自己的数据库连接 如果我弄错了,请告诉我 但假设我设置了自动提交模式,并在单个SQL语句中处理每个请求。或者,假设我只读取而不是写入数据库。在这两种情况下,我似

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

烧瓶文件:

因为数据库连接封装了一个事务,所以我们还需要确保在同一时间只有一个请求使用该连接

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

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

如果我弄错了,请告诉我

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

编辑:我可以看出我的建议有一个问题:每个请求可能由不同的流程处理。既然连接应该,让我澄清我的问题:我的意思是每个进程创建一个连接,并将其用于所有碰巧由该进程处理的请求

另一方面,(绿色或本机)线程的全部要点通常是为每个线程提供一个请求,因此我提出的方法意味着跨线程共享连接。看起来是,但是

让我们具体地说,我的环境是flask+gunicorn,有多个多线程同步工作者。

基于@Craig Ringer,我想我知道答案


连接共享的唯一可能优势是性能(其他因素,如事务封装和简单性,有利于每个请求单独连接)。而且,由于连接不能在进程或绿色线程之间共享,因此只有本机线程才有机会共享。但是
psycopg2
(可能还有其他驱动程序)不允许从同一连接进行并发访问。因此,除非每个请求花费很少的时间与数据库通信,否则连接共享可能会影响性能,而不是带来好处。

还有一种可能的情况,即共享连接是可取的,即希望不同的工作人员看到相同的脏(未提交)数据,或者像临时表一样共享会话状态,CraigRinger说,但是不同的工人有不同的流程(至少在gunicorn中是这样),如果所有人都共享相同的连接(并且实际使用它),我认为他们会相互冲突(根据我问题中引用的警告)。或者你的意思是可以使用锁来避免这个问题吗?如果它们是不同的进程,它们就不能共享连接。(好吧,如果你不使用exec进行fork或将套接字传递给子进程,这是可能的,但只会导致混乱,它不会以任何有用的方式工作)。@CraigRinger这正是我的用例。你建议怎么做?@DylanYoung如果我没弄错的话:运行一个线程,其任务是与数据库对话。代理使用队列从其他线程向它发出请求,并使用队列传递回复。您可能希望在将来或类似情况下包装它,使其成为一个更好的界面。发布一个新问题,并在新问题中包含一个指向该问题的链接,以获取详细信息,可能会有人解释。