2010-12-07 15 views
0

Dans mon application, j'interroge la base de données avec le même sql toutes les secondes. J'ai besoin de savoir quelle mesure devrais-je prendre. Est-ce que cela causera jamais un problème comme "Le délai d'expiration s'est écoulé avant d'obtenir une connexion du pool." ou tout autre comme ça?Je suis en permanence interroger la base de données; devrait-il y avoir un problème?

Actuellement, je crée une nouvelle connexion toutes les secondes et la jette après son utilisation. Dois-je réutiliser la connexion dans ce cas.

Quelle est la meilleure approche?

+0

Pouvez-vous nous dire pourquoi? Vous pourriez vous retrouver avec de gros problèmes si votre requête commence à prendre plus d'une seconde à s'exécuter. – darioo

Répondre

1

La meilleure pratique à mon humble avis est de pomper et de vidanger les connexions le plus rapidement possible - utilisez-les pour accéder à ce dont vous avez besoin et fermez-les immédiatement. Votre ennemi n'est pas responsable des performances pour créer une connexion (bien qu'il y en ait une partie) - il verrouille une table dans votre base de données. Si vous cherchez à optimiser votre application, vous devriez essayer de mettre en place un mécanisme de mise en cache qui vous évite d'avoir à faire un aller-retour dans la base de données pour chaque recherche. Ce serait à votre avantage sur le plan du rendement.

Une autre chose que vous pouvez faire est d'utiliser des connexions en lecture seule où vous pouvez - ils nécessitent moins de frais généraux que les traditionnels et permettra également d'améliorer vos performances.

+0

La mise en cache n'est pas une solution ici. C'est toujours une nouvelle donnée à chaque voyage. – Faisal

+0

BTW, comment puis-je faire des connexions de base de données en lecture seule? – Faisal

+0

La seule vraie façon de le faire est d'utiliser un DataReader - http://msdn.microsoft.com/en-us/library/aa720705(v=VS.71).aspx - c'est un en lecture seule, en avant seulement curseur donc c'est beaucoup plus performant. De plus, il utilise l'exécution différée de sorte que vous pouvez continuer à cliquer sur le même DataReader une fois par seconde pour extraire les dernières données de votre base de données si vous le souhaitez. – Aaronontheweb

0

Pourquoi avez-vous besoin de faire cela?

Vous pouvez essayer de mettre en cache les données pour réduire la charge sur votre base de données. Avez-vous besoin de données datant d'une seconde ou de 5 secondes?

La fermeture de la connexion après chaque utilisation est OK. Il ne se ferme pas vraiment, il retourne simplement dans le pool de connexions.

+0

La mise en cache n'est pas une solution ici dans mon cas. Chaque requête de base de données attend un nouveau jeu de résultats ici. – Faisal

+0

Mais la question est pourquoi? peut-être quelqu'un a une meilleure solution à votre problème. – TalentTuner

+0

Il y a beaucoup de documents téléchargés sur notre serveur et leur enregistrement est sauvegardé dans la base de données. Nous avons un service qui interroge la base de données toutes les secondes pour trouver les nouveaux documents, puis traite chaque document (filtrer et renommer, etc.) en fonction de ses méta-informations. Et met à jour l'enregistrement de la base de données à la fin. – Faisal

0

Si la bibliothèque que vous utilisez met en effet en commun les connexions pour vous, cela ne fait aucune différence. Si ce n'est pas le cas, il serait préférable d'utiliser la même connexion plusieurs fois. Créer une connexion prend du temps.

Quelques questions ...

  • Quelles sont les données que vous obtenez de la base de données?
  • Est-ce que ces données peuvent être stockées dans la mémoire de l'application?
+0

pourquoi le vote vers le bas? – jgauffin

0

Il n'y a pas de problème dans cette approche si vous disposez des connexions comme ceci:

using (SqlConnection cnn = new SqlConnection(ConnectionString)) 
{ 
      SqlCommand cmd = new SqlCommand(commandText, cnn) 
      { 
       CommandType = CommandType.Text 
      }; 

      DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds); 

      return ds; 
} 

Le seul problème peut se produire - est la diminution de votre performance db si votre matériel est pas bon enought.

1

Vous devez absolument ouvrir et fermer la connexion à chaque fois. En effet, si votre bloc using a beaucoup de code après la dernière utilisation de la connexion, appelez Close() pour le remettre dans la piscine dès que possible. De cette façon, le risque d'une autre utilisation ne nécessitant pas l'ouverture d'une nouvelle connexion est réduit (voir What does "opening a connection" actually mean? pour en savoir plus sur l'ouverture d'une connexion réelle et la sortie d'une connexion).

Est-ce "une fois par seconde" une moyenne sur différents threads, ou tous sur un thread? Si tout est sur un thread, cela n'a pas d'importance, en effet, il peut même être plus rapide de garder l'objet de connexion ouvert, car il n'y aura pas de conflit pour l'un ou l'autre.Je considérerais certainement les résultats de la mise en cache, même si cela a des inconvénients dans l'utilisation de la mémoire, ainsi que des problèmes potentiellement compliqués concernant le moment où les résultats mis en cache doivent être actualisés - cela peut être trivial ou impossible selon ce que vous faites .

Il est également clairement question de faire un effort supplémentaire lors de l'optimisation.