2009-01-27 3 views
2

Je reçois cette erreur tous les quelques jours. Je ne vais pas voir l'erreur pendant quelques jours, alors je vais avoir une rafale de 20 ou plus avec une minute ou deux.Le délai écoulé avant l'obtention d'une connexion du pool

J'ai été très poussée à lancer mon code de sorte que j'utilise cette configuration de base pour mon accès DB.

try 
{ 
    myConnection.Open(); 
    mySqlDataAdapter.Fill(myDataTable); 
    myConnection.Close(); 
} 
Catch (Exception err) 
{ 
    if (myConnection.State != ConnectionState.Closed) myConnection.Close(); 
    throw err; 
} 

La façon dont je comprends cela devrait exécuter mes requêtes et libérer immédiatement la connexion à la piscine, mais si quelque chose se passe mal avec la requête alors j'attraper le excpetion fermer ma connexion puis jeter l'erreur up, qui a finalement est pris au piège au niveau de l'application et les journaux et les e-mails me l'erreur.

Même en utilisant ceci dans tout mon code, je suis encore en train de résoudre le problème. Que puis-je faire pour diagnostiquer la cause première du problème?

+0

Est-il possible que vous soyez simplement à court de connexions? –

+0

Est-ce que vous avez des événements du serveur SQL vous-même (c'est-à-dire deadlocks, timeouts)? – Radu094

Répondre

1

changer le code à quelque chose comme cela rend plus facile à lire ..

try 
{ 
    myConnection.Open(); 
    mySqlDataAdapter.Fill(myDataTable); 
} 
Catch (Exception err) 
{ 
    throw err; 
} 
finally 
{ 
myConnection.Close(); 
} 

Mais il ne permet pas votre délai d'attente ..

Il sonne comme la déclaration de remplissage prend trop de temps. Ou que le problème est réellement ailleurs, où vous ne faites pas la connexion. Le profilage SQL peut vous aider à déterminer si l'instruction select prend trop de temps.

+0

il ne peut pas être la faute de l'instruction de remplissage. Si le délai est dépassé pour obtenir une connexion du pool, alors myConnection.Open() ne se termine pas et n'atteint jamais le Fill() – adambox

3

Le problème est le nombre de connexions regroupées que vous pouvez avoir dans le pool.

Dans votre chaîne de connexion, vous pouvez ajouter l'attribut "Max Pool Size = 100" pour augmenter la taille de votre piscine. Cependant, il semble que vous exécutiez simultanément un nombre important de requêtes SQL, qui sont toutes en cours d'exécution. Peut-être devriez-vous chercher des moyens de raccourcir les requêtes ou de les exécuter séquentiellement via une seule connexion.

0

Si vous utilisez MSSQL mis en place un profil en cours d'exécution pendant un certain temps un jour ou deux .. Faire le profil à enregistrer dans un fichier ou une table, le fichier est censé être plus rapide ...

Et puis, ayant un script lisant ce fichier dans une table, vous pouvez facilement l'interroger pour trouver les requêtes les plus longues.

0

Une question rapide ici. Êtes-vous par hasard sur un DB d'accès parce qu'il y a une limite sur le nombre de connexions que vous pouvez avoir simultanément sur ce qui conduirait à votre type d'erreur. Le service SQL ne devrait pas avoir le même problème.

Si vous exécutez SQL Server, désactivez le regroupement de connexions et voyez si cela fait une différence pour votre application.

J'ai découvert avec notre système il y a environ 5 ans, quand notre société connaissait une croissance rapide, que nous avons fondamentalement brisé l'accès lorsque nous avons commencé à frapper constamment le plafond de l'utilisateur. Nous sommes passés à SQL dans environ 24 heures et n'avons pas eu de problème depuis.

+0

Non c'est SQL complet –