2012-07-16 74 views
5

我有一个db = pymongo.Connection()在Django的views.py中调用一个简单的MongoDB连接来存储一些简单的统计信息。Django + PyMongo池的最佳做法?

使自动支持MongoDB连接池的最佳做法是什么?

我需要把end_request()代码放在哪里?

如何在连接期间选择max_pool_size参数?

回答

7

How does connection pooling work in PyMongo?

每个连接实例已内置连接池。默认情况下,每个线程在其第一次操作中获取自己的套接字。那些 套接字被保持,直到end_request()被该线程调用。

调用end_request()允许将套接字返回到池 并由其他线程使用而不是创建新的套接字。 明智地使用这种方法对于有很多 线程或长时间运行的线程的应用程序非常重要,这些线程几乎不会调用PyMongo 操作。

或者,使用auto_start_request = False创建的连接将在所有线程中安全地共享套接字(socket)( )。

我认为这取决于您拥有的应用程序的类型以及请求持续连接的时间。调用end_request的想法有助于长时间运行的请求长时间保持套接字,并导致创建多个套接字。如果单个请求可以在不再需要连接时释放连接,则该套接字可用于其他请求。

如果他们是快速请求,那么我相信auto_start_request=False通过重用套接字的作品。

确保连接始终使用相同的套接字表示将具有一致的读取。想想如果你提出了一个查询,但它延迟了,然后立即做了另一个查询,并使用了一个不同的套接字。这个套接字设法在之前做出响应。你将会有不一致的数据,因为它不能反映前面的写入。

+0

嗨@jdi,感谢您的回答,您可以与'max_pool_size'参数分享您的提示吗? – est 2012-07-16 06:35:16

+1

它是一种管理单个连接允许的连接数的方法。如果你的应用程序是单线程的,那么它只会在池中消耗1个。如果它是一个严重线程的应用程序,则每个线程将有一个,并且您可能希望能够限制在一台服务器上允许的数量。 – jdi 2012-07-16 15:23:48

+1

在PyMongo 3中,“auto_start_request”选项消失。 – Mithril 2016-03-23 06:16:10