Ouverture de la connexion à la base de données une fois ou à chaque action de base de données?

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

Question

Je crée actuellement un portail Web avec ASP.NET qui repose largement sur l'utilisation de la base de données. Fondamentalement, chaque (et presque tous les: P) requêtes GET de n'importe quel utilisateur entraînera une requête sur la base de données à partir du serveur Web.

Maintenant, je suis vraiment nouveau dans ce domaine et je suis très préoccupé par les performances. En raison de mon manque d'expérience dans ce domaine, je ne sais pas vraiment à quoi m'attendre.

Ma question est la suivante: avec ADO.NET, serait-il plus judicieux de laisser une connexion statique ouverte du serveur Web à la base de données, puis de vérifier l'intégrité de cette connexion serveur avant chaque requête à la base de données? - Ou est-il préférable d'ouvrir la connexion avant chaque requête et de la refermer ensuite?

Dans ma tête, la première option serait préférable car vous gagnez du temps en négociation, etc. avant chaque requête et vous économisez de la mémoire tant sur la base de données que sur le serveur car vous n'avez qu'une seule connexion, mais y at-il des inconvénients à cette approche ? Deux requêtes envoyées simultanément risquent-elles de détruire l'intégrité des autres ou de mélanger le jeu de données renvoyé?

J'ai essayé de chercher partout, ici et sur le Web, des pratiques exemplaires en la matière, mais sans succès. Le plus proche de moi était celui-ci: est-il sûr de gardez les connexions à la base de données ouvertes pendant longtemps , mais cela semble plus approprié pour les systèmes distribués où vous avez plus d'un utilisateur de la base de données, alors que je n'ai que mon serveur Web.

Était-ce utile?

La solution

Vous êtes bien trop tôt pour vous soucier de la performance.

Quoi qu'il en soit, les connexions sont regroupées par le cadre. Vous devriez les ouvrir, les utiliser et les jeter dès que possible.

Quelque chose comme ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

Autres conseils

Il est préférable de laisser ADO.NET gérer le regroupement des connexions. Il persistera la connexion s'il le juge nécessaire, mais n'utilise pas d'objet de connexion statique. Ça sent juste. Il serait préférable de passer l'objet de connexion aux méthodes qui en ont besoin et de créer la connexion dans un bloc à l'aide de .

Vous devriez toujours fermer votre connexion après avoir terminé votre interaction avec la base de données. ADO.NET dispose d’un pool de connexions qui assure une réutilisation efficace des connexions. Chaque fois que vous ouvrez une 2e, une 3e et les suivantes connexions, elles seront prises dans un pool avec pratiquement pas de surcharge.

J'espère que cela vous aidera.

Je penserais davantage à la mise en cache qu'au regroupement avancé de connexions. Chaque get nécessite un hit de base de données?

Si c'est un portail dont le contenu est commun et le contenu spécifique à l'utilisateur, le cache vous permet de stocker des éléments communs ainsi qu'avec une clé mutilée (avec l'identifiant de l'utilisateur). Vous pouvez également stocker des éléments spécifiques à l'utilisateur.

ADO.NET effectue le regroupement de connexions. Lorsque vous appelez close sur l'objet de connexion, la connexion reste dans le pool, ce qui accélère considérablement la connexion suivante.

Votre intuition initiale est correcte. Vous avez besoin du mise en commun des connexions de base de données.

Vous ne voulez certainement pas ouvrir une connexion pour chaque appel de base de données, cela entraînerait des performances extrêmement médiocres très rapidement. Établir une base de données en se connectant coûte très cher.

Au lieu de cela, vous devriez utiliser un pool de connexions. Le pool gérera vos connexions et tentera de réutiliser les connexions existantes lorsque cela est possible.

Je ne connais pas votre plate-forme, mais examinez le regroupement de connexions. Une bibliothèque ou un utilitaire doit être disponible (dans le système de base, en tant qu’add-on ou fourni avec les pilotes de base de données) qui vous fournira les moyens nécessaires. pour regrouper plusieurs connexions actives à la base de données, qui sont prêtes et qui sont prêtes à être utilisées lorsque vous en obtenez une à partir du pool.

Pour être honnête, je m'attendrais à ce que le regroupement se produise par défaut dans n'importe quelle bibliothèque d'abstraction de base de données (avec une option disponible pour la désactiver). Il semble qu'ADO.NET le fasse.

La première question à poser est la suivante: Pourquoi êtes-vous très préoccupé par les performances? Quelle est votre charge de travail attendue? Avez-vous déjà essayé?

Mais en général, oui, il est plus judicieux d’avoir une connexion ouverte que vous gardez pendant un certain temps que de rouvrir une connexion de base de données à chaque fois; En fonction du type de connexion, des problèmes de réseau et de la phase de la lune, cela peut prendre une bonne partie de la seconde ou plus pour établir une connexion initiale; Si votre charge de travail est telle que vous attendez plus d'une opération GET toutes les cinq secondes environ, vous serez plus heureux avec une connexion permanente.

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