Nous avons une application basée sur ADO.NET. Nous suivons quelques bonnes pratiques simples qui nous permettent d'utiliser le pool de connexion. Par exemple, un bloc de code qui utilise une base de données pourrait ressembler à ceci:Gestion de la connectivité de la base de données avec ADO.NET
using(DbConnection dbConnection = GetDatabaseConnection()) { doWork(); }
FWIW, il n'y a rien de spécial getDatabaseConnection. Il établit une connexion avec la base de données qui est en cours d'exécution MSSQL Server 2000. En fait, il se lit comme suit:
DbConnection GetDatabaseConnection() { return GetConnection(MyConnectionString); } DbConnection GetConnection(String connectionString) { try { SqlConnection dbConnection = new SqlConnection(connectionString); dbConnection.Open(); return dbConnection; } catch(InvalidOperationException ex) { handleError(ex); throw; } catch(DbException ex) { handleError(ex); } }
En tant que tel, nos connexions sont éliminés à la fin de la portée du bloc. Cependant, nous avons rencontré un petit problème lorsque nous avons commencé à tester l'application. Nous avons trouvé que notre application est très explosive, ce qui signifie qu'il y a des moments où cela devient très bavard et se tait pendant un moment. Le résultat est que nous pouvons avoir plusieurs threads simultanément tout venant pour obtenir une connexion.
Alors imaginez que vous avez 10 discussions. Un lot de travail (ne pas essayer de reformuler le lot de travail) arrive et est segmenté sur quelques threads. Chaque thread tente ensuite d'obtenir une connexion et boom, je suis frappé avec une exception InvalidOperationException. J'ai ajusté le ConnectTimeout et tout ce que cela fait, c'est allonger le temps jusqu'à ce que je reçoive une rafale d'exceptions. Une fois que j'ai passé la phase de «liquidation», l'application est bien. Puis il se repose à nouveau, les connexions "s'en vont" et le processus recommence.
J'ai également essayé de peaufiner le LoadBalanceTimeout, mais les exceptions continuent d'être appliquées. Avez-vous déjà vu ce problème? Des pensées ... Je vais jeter quelques-unes des miennes.
- Continuellement garder une connexion « chaud »
- tentative d'ouvrir la connexion à nouveau jusqu'à un certain nombre de tentatives
- Mettre en oeuvre ma propre connexion mise en commun (bleah, pas intéressé à réinventer la roue)
Modifier:
La plupart des forums que j'ai lus se sont découragés en augmentant la taille du pool de connexion. Par défaut, le pool de connexions a une limite supérieure de 50 connexions (c'est plus que suffisant - si je dois l'augmenter, quelque chose est fondamentalement faux ailleurs). Ce que je remarque est que lorsque le ConnectTimeout est faible, l'exception InvalidOperationException se produit. C'est comme si la mise en route de la connexion était trop longue et les connexions en attente tout le temps d'attente.
MARS est certainement une option ... Le texte de la InvalidOperationException.Message est:
Délai d'attente expiré. Le délai d'expiration s'est écoulé avant l'obtention d'une connexion du pool. Cela peut être dû au fait que toutes les connexions groupées étaient utilisées et que la taille maximale du pool a été atteinte.
Quel est le texte dans .Message (ou .ToString()) de votre InvalidOperationException? –
S'agit-il d'une application winforms ou asp.net? –
Pouvez-vous publier la chaîne de connexion? (De toute évidence XXX sur le nom d'utilisateur/mot de passe et le nom de la base de données pour protéger l'innocent) – BenAlabaster