Pourquoi est-il déconseillé de faire de multiples connexions de base de données dans une requête?

StackOverflow https://stackoverflow.com/questions/28590

Question

Une discussion sur les Singletons dans PHP a moi de penser à ce problème de plus en plus.La plupart des gens demander que vous ne devriez pas faire un tas de DB connections dans une requête, et je suis juste curieux de savoir ce que votre raisonnement est.Ma première pensée est des frais, à votre script de faire en sorte que de nombreuses demandes de la DB, mais ensuite j'ai contre moi-même la question:ne serait pas de multiples connexions simultanées interrogation plus efficace?

Comment parler de certaines réponses (avec des preuves, les gens) à partir de certaines personnes dans le savoir?

Était-ce utile?

La solution

Connexions de base de données sont une ressource limitée.Certains DBs ont une très faible limite de connexion et de perdre des connexions est un problème majeur.En consommant beaucoup de connexions, vous pouvez bloquer les autres pour l'utilisation de la base de données.

En outre, en jetant une tonne de connexions supplémentaires à la DB n'aide pas, sauf si il y a des ressources sur le serveur de base de données est inactive.Si vous avez des 8 cœurs et une seule est utilisée pour répondre à une requête, bien sûr, faire un autre lien qui pourrait aider.Plus probablement, cependant, vous êtes déjà à l'aide de tous les cœurs disponibles.Vous êtes également susceptible de frapper le même disque dur pour chaque demande de bd, et en ajoutant des supplémentaires de verrouillage.

Si votre DB a quelque chose ressemblant à forte utilisation, l'ajout de connexions ne va pas aider.Ce serait comme de frai supplémentaire threads dans une application avec l'espoir aveugle que le supplément de la simultanéité permettra un traitement plus rapide.Il peut dans certaines circonstances, mais dans d'autres cas, il va tout simplement vous ralentir comme vous le thrash, le disque dur, les déchets de la tâche de temps de commutation, et d'introduire de la surcharge de la synchronisation.

Autres conseils

C'est le coût de la création de la connexion, le transfert de données, puis de le déchirer vers le bas.Il va manger votre performance.

La preuve est plus difficile à trouver mais d'envisager la suite...

Disons qu'il prend x microsecondes pour établir une connexion.

Maintenant, vous voulez faire plusieurs demandes et d'obtenir les données d'avant en arrière.Disons que la différence de temps de transport est négligeable entre une connexion et de nombreux (juste ofr la clarté de l'exposé).

Maintenant, disons qu'il faut y microsecondes pour fermer la connexion.

Ouverture d'une connexion prendra x+y microsecondes de frais généraux.L'ouverture de nombreux prendra n * (x+y).Pour retarder l'exécution de votre.

Configurer une connexion DB est généralement assez lourds.Beaucoup de choses se passent dans les coulisses (Résolution DNS/connexion TCP/poignée de main/Authentification/de Requête).

J'ai eu un problème une fois avec un étrange configuration DNS qui fait de chaque connexion TCP a fallu quelques secondes avant de remonter.Ma procédure de connexion (à cause de l'architecture complexe) a pris 3 DB connexions à compléter.La question, c'était prendre une éternité pour ouvrir une session.Nous avons ensuite refait le code pour le faire passer par une connexion uniquement.

Nous avons accès à de Informix .NET et de l'utilisation de plusieurs connexions.Si nous ne sommes démarrage d'une transaction sur chaque connexion, il est souvent traitée dans le pool de connexion.Je sais que c'est très spécifique à la marque, mais la plupart(?) systèmes de base de données cilent accès pool de connexions au meilleur de sa capacité.

En aparté, nous avons eu un problème avec le nombre de connexions à cause de la croix-connexions de base de données.Informix prend en charge des synonymes, de sorte que nous synonymed la commune délinquants et les multiples liens qui ont été traités côté serveur, économisant ainsi beaucoup de temps de transfert, la création de la connexion les frais généraux, et (le véritable nœud de notre situtation) de frais de licence.

Je suppose que c'est parce que vos demandes ne sont pas transmis de manière asynchrone, depuis votre demande de manière itérative sur le serveur, le blocage à chaque fois, vous avez à payer pour les frais généraux de la création d'une connexion à chaque fois, lorsque vous avez seulement à faire une fois...

Dans Flex, tous les appels de service web sont automatiquement appelée de façon asynchrone, donc vous, il est fréquent de voir des connexions multiples, ou en file d'attente des requêtes sur la même connexion.

Des requêtes asynchrones atténuer le coût de la connexion grâce à l'accélération de requête / réponse en temps...parce que vous ne pouvez pas facilement atteindre cet objectif en PHP sans quelques threading, alors l'impact sur les performances est plus alors simplement en réutilisant la même connexion.

c'est mon 2 cents...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top