On 28 févr. 2013, at 00:12, Aymeric Augustin <
aymeric....@polytechnique.org> wrote:
> I'm just wondering if 10 minutes is a good default value for CONN_MAX_AGE.
Since I committed the patch, I discovered that persistent connections don't interact well with runserver.
By default, the development server creates a new thread for each request it handles. Not only does this negate the effect of persistent connections (they're thread-local), but it also keeps connections open until they're garbage collected, making it easy to exceed the maximum number of available connections.
Florian independently discovered the same problem with gunicorn + gevent, because the gevent worker runs each request in its own "thread" (greenlet).
This raises the following questions:
1) Do we want to enable persistent connections in production by default?
a) yes
b) yes, through a deprecation path
c) no
2) Assuming the answer to 1) is yes, can we fix runserver?
a) close connections at the end of the dev server request handler
=> creates tight coupling between the dev server and the ORM :(
b) disable persistent connections when DEBUG = True
=> badly targeted: some people may use runserver with DEBUG = False, or want persistent connections when DEBUG = True
c) ???
The lazy solution is to disable persistent connections by default, document the problem with servers that run each request in its own thread, and recommend to set `DATABASES['default']['CONN_MAX_AGE'] = 0 if settings.DEBUG else 600`.
Besides, I've observed that performance is often less of a concern that backwards-compatibility and ease of use; from this perspective, disabling persistent connections would be appropriate.
What do you think?
--
Aymeric.