IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web avec .NET Discussion :

Timeout en C#


Sujet :

Développement Web avec .NET

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Timeout en C#
    Bonjour,

    Je suis en framework 3.5 avec VS2008 IIS6 et SQL 2005.
    Mon application est full web.

    J'ai écris une procédure stockée qui executé directement dans SQL Server Management s'exécute entre 1 et 4 secondes suivant le cache.

    Quand j'execute la même procédure stockée avec les même paramètres via le C# j'arrive en timeout (plus de 30 secondes).

    Je ne comprend pas comment peut s'expliquer une telle différence de temps d'exécution.
    Voici la commande passée en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IDataReader rdr = this.DbProvider.ExecuteReader(command)
    Pour information ma requete remonte a peine 310 lignes.

    Si quelqu'un peut m'aider car la je suis coincé.

    Merci.
    Tozoul

  2. #2
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Bonjour,

    Ne serait-ce pas un Timeout au niveau de la connexion plutôt qu'au niveau de la requête ? Quelle est l'exception renvoyée précisément ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,
    En premeir, il doit y avoir un Timeout sur la commande (30 sec par défaut). Ensuite comment utilises tu le reader ? Il est très important de la fermer (Close) à la fin de ton traitement.

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Effectivement, le timeout est du à la connexion (30s) mais ma question est surtout orienté dans le problème de performance entre un appel depuis le requeteur et un appel en C# qui prend au moins 10 fois plus de temps.

    Appel d'une même requête avec les même paramètres :
    - SQL Management : entre 1 et 4 secondes
    - Depuis le C# : timeout au bout des 30 secondes.

    Et je n'arrive pas à comprendre les différence de performance entre les deux.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par Tozoul Voir le message
    Bonjour,

    Effectivement, le timeout est du à la connexion (30s) mais ma question est surtout orienté dans le problème de performance entre un appel depuis le requeteur et un appel en C# qui prend au moins 10 fois plus de temps.

    Appel d'une même requête avec les même paramètres :
    - SQL Management : entre 1 et 4 secondes
    - Depuis le C# : timeout au bout des 30 secondes.

    Et je n'arrive pas à comprendre les différence de performance entre les deux.
    Est ce que ramènes tout dans SQL Management ?
    Je vois que tu n'a pas beaucoup de ligne, mais sont elles de tailles importantes (colonnes blob, text, ...) ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Les enregistrements comportent 20 colonnes sans métadonnées, une majorité de texte entre 10 et 150 caractères et le reste en numérique et float.

  7. #7
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Effectivement, le timeout est du à la connexion (30s)
    Tozoul,

    Il ne faut pas confondre le CommandTimeout et le ConnectionTimeout. Le premier intervient lorsque la requête executée prend trop de temps, le second lorsque la tentative de connexion à ton SGBD dépasse le délai.

    Un Timeout lors de la connexion ne signifie pas que ta requête n'est pas performante ! Généralement, executer une requête SQL en passant par C# donne un temps d'execution assez semblable à celui d'une requête executée directement dans SQL Management ( après, il y a quand même quelques écarts, croissants avec le volume de données, mais ça ne représente rien pour 310 lignes).

    Peut être un problème avec la ConnectionString ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Au risque de me répéter et en suivi du post de Nicolas, ta connexion reste ouverte tant que tu n'as pas fermé le reader via Close. Le DataReader fait partie du "mode connecté". Peux tu nous dire ce que tu fais avec ce reader ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je m'exprime surement pas correctement mais je n'arrive pas à ouvrir le reader car ma procédure stockée n'arrive pas à finir par contre ma connexion à la base de données ne rentre pas de problème.

    Mon problème est lié à l'execution de la procédure stockée qui est en arrive en timeout mais ma connexion est toujours ouverte sur ma BDD.

    Je n'arrive dont pas à ouvrir mon datareader et donc il ne reste pas ouvert. En plus, je le créer avec un using.

    Merci de votre aide

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par Tozoul Voir le message
    Je m'exprime surement pas correctement mais je n'arrive pas à ouvrir le reader car ma procédure stockée n'arrive pas à finir par contre ma connexion à la base de données ne rentre pas de problème.

    Mon problème est lié à l'execution de la procédure stockée qui est en arrive en timeout mais ma connexion est toujours ouverte sur ma BDD.

    Je n'arrive dont pas à ouvrir mon datareader et donc il ne reste pas ouvert. En plus, je le créer avec un using.

    Merci de votre aide
    ah ok.
    Mise à part un problème sur les EntLiv, il faudrait vérifier la commande que tu lui passes. Un exemple ?

    Il faudrait aussi vérifier qu'une autre commande passe bien, sans TimeOut.

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Voici l'exemple pour la création de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                DbCommand command = db.GetStoredProcCommand("dbo._sp_Bundle_SearchActiveBundleActivitiesByActivityTypeSiteOrThirdPartyIDAndUserID");
                db.AddInParameter(command, "activityTypeID", DbType.Int64, activityTypeID);
                db.AddInParameter(command, "siteID", DbType.Int64, siteID);
                db.AddInParameter(command, "userID", DbType.Int64, userID);
                db.AddInParameter(command, "thirdPartyID", DbType.Int64, thirdPartyID);
                db.AddInParameter(command, "searchBundleID", DbType.Int64, searchBundleID);
                db.AddInParameter(command, "searchDocumentReference", DbType.String, searchDocumentReference);
                db.AddInParameter(command, "searchProductID", DbType.Int64, searchProductID);
                db.AddInParameter(command, "searchContainerID", DbType.Int64, searchContainerID);
    Et j'ai d'autres procédure stockées qui prennent un temps "normal" pour me rendre la main.

  12. #12
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je pense avoir trouver une partie de l'explication, mon index n'était pas à jour.

    Je viens de rebuild mon index et la procédure stockée ne tombe plus en timeout.

    Mais cela n'explique pas la différence de temps entre les deux appels mais au moins cela ne me bloque plus.

    Tozoul

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par Tozoul Voir le message
    Je pense avoir trouver une partie de l'explication, mon index n'était pas à jour.

    Je viens de rebuild mon index et la procédure stockée ne tombe plus en timeout.

    Mais cela n'explique pas la différence de temps entre les deux appels mais au moins cela ne me bloque plus.

    Tozoul
    curieux en effet...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TOMCAT] Problème de timeout d'une servlet
    Par tuxor dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 18/09/2007, 12h04
  2. Alter Session : question de TimeOut
    Par Filippo dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2004, 17h42
  3. [JSP]recuperer session-timeout dans web.xml
    Par seb_fou dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/05/2004, 16h01
  4. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22
  5. Ftp login & Timeout
    Par MSP dans le forum Modules
    Réponses: 6
    Dernier message: 29/08/2003, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo