59 votes

Connexion persistante à la base de données Django

Je suis l'aide de django avec apache et mod_wsgi et PostgreSQL (tous sur le même hôte), et je dois gérer beaucoup de dynamique simple page de requêtes (des centaines par seconde). J'ai fait face à un problème que le goulot d'étranglement est que django n'ont pas de base de données persistante de connexion et se reconnecte sur chaque demande (qui prend près de 5ms). Tout en faisant un point de référence, je suis que la connexion persistante je peux gérer près de 500 r/s, tandis que sans que je obtenir seulement 50 r/s.

Quelqu'un aurait des conseils? Comment modifier django pour utiliser une connexion permanente? Ou de la vitesse de la connexion à partir de python DB

Merci à l'avance.

35voto

Cesar Canassa Points 3579

Django 1.6 a ajouté le support des connexions persistantes :

Les connexions persistantes évitent l’obligation de rétablir une connexion à la base de données dans chaque demande. Ils sont contrôlés par le paramètre CONN_MAX_AGE qui définit la durée de vie maximale d'une connexion. Il peut être défini indépendamment pour chaque base de données.

20voto

Glenn Maynard Points 24451

Dans Django tronc, éditer django/db/__init__.py et commentez la ligne:

signals.request_finished.connect(close_connection)

Ce gestionnaire de signal provoque la déconnexion de la base de données après chaque demande. Je ne sais pas ce que tous les effets secondaires de le faire, mais il ne ferait aucun sens de commencer une nouvelle connexion après chaque demande; il détruit les performances, comme vous l'avez remarqué.

Je suis en ce moment, mais je havn't fait une série complète de tests pour voir si quelque chose se brise.

Je ne sais pas pourquoi tout le monde pense qu'il a besoin d'un nouveau backend ou une connexion spéciale pooler ou d'autres solutions complexes. Cela semble très simple, bien que je ne doute pas il y a quelques obscures pièges qui fait d'eux de le faire, en premier lieu, ce qui devrait être traitée avec plus de discernement; 5ms surcharge pour chaque demande qui est beaucoup pour un service performant, comme vous l'avez remarqué. (Il me prend 150ms--je havn'pas compris pourquoi).

Edit: une autre nécessité de changement dans django/middleware/transaction.py; retirez les deux transactions.is_dirty() tests et toujours appeler commit() ou rollback(). Sinon, il ne sera pas valider une transaction si elle ne lire à partir de la base de données, qui va laisser des serrures ouvertes qui devraient être fermés.

16voto

Igor Katson Points 904

J'ai créé un petit correctif Django qui implémente le regroupement de connexions de MySQL et PostgreSQL via le regroupement sqlalchemy.

Cela fonctionne parfaitement sur la production de http://grandcapital.net/ pendant une longue période.

Le patch a été écrit après avoir googlé un peu le sujet.

4voto

codeape Points 38576

Avertissement: je n'ai pas essayé.

Je crois que vous avez besoin pour mettre en œuvre une base de données personnalisée de retour à la fin. Il y a quelques exemples sur le web qui montre comment implémenter une base de données back-end avec le regroupement de connexion.

À l'aide d'un pool de connexion serait probablement une bonne solution pour vous, du fait que le réseau de connexions ouvertes lorsque les connexions sont retournés à la piscine.

  • Ce poste accomplit ceci en application de correctifs Django (un des commentaires les points que c'est mieux de mettre en œuvre une coutume de fin de retour à l'extérieur de la base de django code)
  • Ce post est une mise en œuvre d'une coutume db back-end

Les deux messages d'utiliser MySQL - peut-être que vous êtes en mesure d'utiliser des techniques similaires avec Postgresql.

Edit:

  • Le Django Livre mentionne Postgresql regroupement de connexion, à l'aide de pgpool (tutoriel).
  • Quelqu'un a publié un patch pour le psycopg2 backend qui met en œuvre le regroupement de connexion. Je suggère la création d'une copie de l'existant en fin de retour dans votre propre projet et l'application de correctifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X