Django + PyMongo连接池的最佳实践是什么?

12

我在Django的views.py中有一个db = pymongo.Connection()调用,用于简单的MongoDB连接以存储一些简单的统计信息。

如何最佳实践地使其自动支持MongoDB连接池?

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

在连接过程中如何选择max_pool_size参数?

1个回答

14

PyMongo中的连接池如何工作?

每个Connection实例都具有内置的连接池。默认情况下,每个线程在其第一次操作时获得自己的套接字。这些套接字保持到该线程调用end_request()。

调用end_request()允许将套接字返回到池中,并由其他线程使用,而不是创建新的套接字。对于具有许多线程或长时间运行的线程的应用程序,谨慎使用此方法非常重要,这些线程对PyMongo操作进行了很少的调用。

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

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

如果请求很快,那么我相信auto_start_request=False通过重用套接字来工作。
确保连接继续使用同一套接字意味着它将具有一致的读取。想象一下,如果您发出了一个查询,但它被延迟了,然后立即进行了另一个查询,并且它使用了不同的套接字。这个套接字能够在之前响应。由于它不反映先前的写入,因此您将拥有不一致的数据。

嗨@jdi,感谢您的回答,您能分享一下关于max_pool_size参数的技巧吗? - est
1
这是一种管理单个连接允许的连接数的方法。如果您的应用程序是单线程的,则它只会在池中消耗1个连接。如果它是一个高度多线程的应用程序,每个线程将有一个连接,并且您可能希望能够限制它在一个服务器上允许的最大连接数。 - jdi
2
在 PyMongo 3 中,“auto_start_request”选项已经被移除。 - Mithril
@jdi,链接已失效。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接