2010-03-02 4 views
1

Salutations, Je dois suivre le problème suivant. J'ai un service WCF qui fonctionne sous IIS7. L'application s'y connecte et le service WCF envoie des requêtes à la base de données. J'ai remarqué dans le moniteur d'activité dans SQL Server 2005 qu'après qu'il y a exactement 102 connexions actives, le pool d'applications dans IIS7 se bloque. Après cela, je ne peux pas me connecter à mon service WCF. Alors seulement IIS7 redémarre aide. Pour la connexion j'utilise ChannelFactory, il est fermé après chaque requête. Je l'ai également introduit un code comme celui-ci pour être sûr que canal est fermé:IIS 7 Pool d'applications - Impossible de se connecter au service WCF

catch (FaultException) 
{ 
    Factory.Abort(); 
    return null; 
} 
catch (CommunicationException) 
{ 
    Factory.Abort(); 

    return null; 
} 
catch (TimeoutException) 
{ 
    Factory.Abort(); 
    return null; 
} 
catch (Exception ex) 
{ 
    Factory.Abort(); 
    return null; 
} 

finally 
{ 
    Factory.Close(); 
    Factory.Abort(); 
} 

J'ai aussi la behvavior suivante pour ma classe de service:

[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple, AutomaticSessionShutdown=true)] 

J'ai aussi ce qui suit dans mon service web .config fichier:

<serviceBehaviors> 
<behavior name="Server.Service1Behavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 

     <serviceThrottling maxConcurrentCalls="2147483647" 
     maxConcurrentSessions="2147483647" 
     maxConcurrentInstances="2147483647" /> 

J'ai tout essayé. S'il vous plaît aidez-moi parce que l'utilisateur ne peut pas travailler comme ça. Pourquoi est-ce qu'après 102 connexions au pool d'applications DB se bloque? Voici le code qui appelle la base de données

internal SqlConnection CheckIfConnectionOpen() 
    { 
     if (_Connection.State != ConnectionState.Open) 
     { 
      _Connection.Open(); 
     } 
     return _Connection; 
    } 
using (SqlCommand cmd = new SqlCommand(query, _Connection)) 
    { 
CheckIfConnectionOpen(); 
//some parameters for sqlcommand here and execute nonQuery or execute reader 
} 

Quelqu'un peut-il s'il vous plaît me aider parce que je suis toujours à la recherche d'une solution

Répondre

1

Sur un long coup le lien ci-dessous explique une situation où la piscine app se bloque, il ne redémarre pas. Si vous pouvez le faire redémarrer, cela devrait diminuer la gravité du problème.

http://i.nconspicuo.us/2008/06/25/iis7-on-windows-server-2008-503-service-unavailable-error-application-pool-stops-unexpectedly/

Vous avez dit que vous avez vérifié le canal est fermé, il peut être bon de confirmer les connexions DB sont trop fermés.

Espérons que cela aide!

+0

J'ai déjà défini StartAutomatically et augmenté le nombre maximum de défaillances. Je n'ai pas aidé. Comment puis-je vérifier si la connexion DB a été fermée? –

+0

Eh bien cela dépend de votre couche d'accès aux données. Utilisez-vous un OR/M ou vous gérez vous-même les objets SessionScope/TransationScope/DBConnection? – Russell

+0

Je gère les objets SessionScope/TransationScope/DBConnection moi-même, chaque requête select commence par l'instruction suivante en utilisant (SqlCommand sqlcmd = new SqlCommand (...)), j'ai aussi TransactionScope en "using" –

0

Vous pouvez configurer une batterie de serveurs Web (plusieurs processus pour le même IIS), ce qui permet de minimiser le problème et de dépendre d'un seul processus (si l'un meurt et redémarre, les autres peuvent soutenir le fort . jusqu'à ce qu'il redémarre

0

en aparté, votre code ci-dessus est équivalent à:

catch (Exception ex) 
{ 
    Factory.Abort(); 
    return null; 
} 
finally 
{ 
    Factory.Close(); 
    Factory.Abort(); 
} 

Et il est tout aussi mauvais que vous voulez probablement connecter l'exception quelque part afin que vous sachiez ce qui est arrivé

..

J'aimerais voir le code qui appelle le base de données Je craindrais que vous ne nettoyiez pas correctement.

+0

Voici le code qui appelle la base de données SqlConnection interne CheckIfConnectionOpen() { if (_Connection.State! = ConnectionState.Open) { _Connection.Open(); } return _Connection; } utilisant (SqlCommand cmd = new SqlCommand (requête, _connection)) { // certains paramètres pour sqlcommand ici // et exécuter ou exécuter nonQuery lecteur } –

+0

et en fait le code de capture ne capture pas toute exception, j'ai juste une réponse nulle du serveur. –

Questions connexes