Quelle est la meilleure solution pour la connexion de base de données mise en commun en python?
J'ai développé quelques personnalisé DAO des classes comme pour répondre à certains très spécialisés pour les besoins de mon projet qui est un processus côté serveur qui ne fonctionne pas à l'intérieur de tout type de cadre.
La solution fonctionne très bien sauf que chaque fois qu'une nouvelle demande est faite, j'ouvre une nouvelle connexion via MySQLdb.connectez.
Quel est le meilleur "chute" de l'interrupteur à l'aide d'une connexion de mise en commun en python? Je suis d'imaginer quelque chose comme les communes DBCP solution pour Java.
Le processus est long et a de nombreux threads qui en ont besoin pour faire des demandes, mais pas tous en même temps... en particulier qu'ils font beaucoup de travail avant de brefs éclats d'écrire une partie de leurs résultats.
Édité pour ajouter:
Après quelques recherche j'ai trouvé anitpool.py qui a l'air correct, mais comme je suis relativement nouveau à python je crois que je veux juste m'assurer que je ne suis pas en manque un plus évident/plus idiomatiques/une meilleure solution.
Vous devez vous connecter pour publier un commentaire.
De l'OMI, le "plus évident/plus idiomatiques/une meilleure solution est d'utiliser un ORM, plutôt que d'inventer de DAO comme des classes.
Il me semble que les ORM sont plus populaires que "raw" connexions SQL. Pourquoi? Parce que Python est OO, et la cartographie à partir de SQL ligne à pour objet est absolument essentiel. Il n'y a pas beaucoup de cas où vous faites affaire avec SQL lignes qui ne correspondent pas à des objets Python.
Je pense que SQLAlchemy ou SQLObject (et du raccordement de mise en commun) les plus idiomatiques Pythonic solution.
Mise en commun comme un élément distinct n'est pas très commun, car pur SQL (sans objet mapping) n'est pas très populaire pour le genre de complexe, de longue durée des processus qui bénéficient de la connexion de la mutualisation. Oui, pur SQL est utilisé, mais il est toujours utilisé en simple ou plus contrôlée les applications où la mise en commun n'est pas utile.
Je pense que vous avez deux solutions:
Dans MySQL?
Je dirais: ne vous embêtez pas avec le regroupement de connexion. Ils sont souvent une source de problèmes et avec MySQL qu'ils ne vont pas vous apporter l'avantage de performance, vous espérez pour. Cette route peut être beaucoup d'efforts pour suivre--politiquement--parce qu'il y a tellement de meilleures pratiques en agitant la main et des manuels de verbiage dans cet espace sur les avantages du regroupement de connexion.
Pools de connexion sont tout simplement un pont entre le post-ère du web des applications sans état (par exemple le protocole HTTP) et de la pré-web ère de la dynamique à long terme du traitement par lot des applications. Puisque les connexions ont été très coûteux en pré-bases de données web (puisque pas de celle utilisée pour les soins de trop sur la durée d'une connexion pris d'établir), post-applications web conçu ce pool de connexions schéma de sorte que chaque coup n'a pas à supporter cette énorme charge de traitement sur le SGBDR.
Depuis MySQL est plus d'un site web de l'ère SGBDR, les connexions sont extrêmement léger et rapide. J'ai écrit beaucoup de volume élevé des applications web qui n'utilisent pas un pool de connexion à MySQL.
C'est une complication, vous pouvez bénéficier de faire sans, tant qu'il n'y a pas une politique d'obstacle à surmonter.
Envelopper votre classe de connexion.
De fixer une limite sur le nombre de connexions que vous faites.
De retour d'une ancienne connexion.
Intercepter à proximité de libérer la connexion.
Mise à jour:
J'ai mis quelque chose comme cela dans dbpool.py:
Vieux thread, mais pour l'usage général du pool de connexions ou de tout cher objet), j'utilise quelque chose comme:
Qui construit paresseusement, propose une option de limite, et devrait s'étendre à toute utilisation je pense. Bien sûr, cela suppose que vous avez vraiment besoin de la mise en commun de ce que des ressources, dont vous ne pouvez pour de nombreuses modernes SQL-aime. Utilisation:
Ceci signifie que quel que soit l'objet ctor crée un destructeur si nécessaire (certains serveurs ne tuent pas les objets de connexion, sauf si elles sont fermées de manière explicite).
yield i
peut soulever d'exception, de sorte que vous devriez envelopper avec try...except. 2.lpool.put(i)
peut renvoyer l'objet en mauvais état (comme db connexion avec l'ouverture de la transaction)Je viens de regarder pour le même genre de chose.
J'ai trouvé pysqlpool et la sqlalchemy piscine module
De faire votre propre pool de connexions est une MAUVAISE idée si votre application décide de commencer à utiliser le multi-threading. Faire un pool de connexion pour une application multi-thread est beaucoup plus compliqué que pour un seul thread de l'application. Vous pouvez utiliser quelque chose comme PySQLPool dans ce cas.
C'est aussi une MAUVAISE idée d'utiliser un ORM si vous êtes à la recherche de la performance.
Si vous allez avoir affaire avec d'énormes lourd bases de données qui ont à gérer beaucoup de sélectionne que, des inserts, des
les mises à jour et supprime dans le même temps, alors vous allez avoir besoin de performance, ce qui signifie que vous aurez besoin de SQL personnalisée écrite afin d'optimiser les recherches et de verrouillage fois. Avec un ORM vous n'avez pas l'habitude d'avoir cette flexibilité.
Donc en gros, oui, vous pouvez faire votre propre pool de connexion et utiliser l'Orm, mais seulement si vous êtes sûrs que vous n'aurez pas besoin de rien de ce que je viens de décrire.
Répondant à un vieux thread mais la dernière fois que j'ai vérifié, MySQL dispose d'une connexion de mise en commun dans le cadre de ses pilotes.
Vous pouvez consultez le :
De TFA, en Supposant que vous souhaitez ouvrir un pool de connexion explicitement (que l'OP avait déclaré):
Cette piscine est alors accessible en demandant de la piscine grâce à la get_connection() fonction.
Utilisation
DBUtils
, simple et fiable.