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

ASP.NET Discussion :

A quel moment établir/fermer la connexion bd lors d'une requête web ?


Sujet :

ASP.NET

  1. #1
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut A quel moment établir/fermer la connexion bd lors d'une requête web ?
    Bonjour,

    Je suis confronté à un petit soucis, je m'explique :

    Lorsqu'un utilisateur web, qui navigue sur mon site, veut accéder à une page web, j'aimerais faire les étapes suivantes :
    - Ouverture de la connexion bd
    - La page demandée fait son traitement
    - Fermeture de la connexion bd lorsque le tout est fini

    Donc, on ne va pas faire ceci dans chaque page, il faut donc passer par Global.asax pour intercepter ces 2 évènements "Arrivée d'une requête web" et "Réponse à la requête web".

    Ce que j'ai fait, c'est d'utiliser les 2 méthodes suivantes dans global.asax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Global_PostAcquireRequestState(object sender, EventArgs e)
    Global_ReleaseRequestState(object sender, EventArgs e)
    Et dans Global_PostAcquireRequestState, je stocke mon objet de connexion à la bd dans l'objet de session. Problème, c'est que quand Global_ReleaseRequestState est appelé (donc quand tout est fini), l'objet de connexion à la bd ne se trouve pas forcément dans l'objet de session... Voir rarement. Du coup, j'ai une objet avec connexion bd ouverte qui s'est perdu je ne sais où...

    Quelle est donc la meilleure solution pour faire ce système d'ouverture de connexion bd au début d'une requête web et fermeture de la connexion lors de la réponse au client ?

    Merci d'avance,

    Jérôme.

  2. #2
    Membre à l'essai

    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Cardi
    Bonjour,

    Je suis confronté à un petit soucis, je m'explique :

    Lorsqu'un utilisateur web, qui navigue sur mon site, veut accéder à une page web, j'aimerais faire les étapes suivantes :
    - Ouverture de la connexion bd
    - La page demandée fait son traitement
    - Fermeture de la connexion bd lorsque le tout est fini

    Donc, on ne va pas faire ceci dans chaque page, il faut donc passer par Global.asax pour intercepter ces 2 évènements "Arrivée d'une requête web" et "Réponse à la requête web".

    Ce que j'ai fait, c'est d'utiliser les 2 méthodes suivantes dans global.asax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Global_PostAcquireRequestState(object sender, EventArgs e)
    Global_ReleaseRequestState(object sender, EventArgs e)
    Et dans Global_PostAcquireRequestState, je stocke mon objet de connexion à la bd dans l'objet de session. Problème, c'est que quand Global_ReleaseRequestState est appelé (donc quand tout est fini), l'objet de connexion à la bd ne se trouve pas forcément dans l'objet de session... Voir rarement. Du coup, j'ai une objet avec connexion bd ouverte qui s'est perdu je ne sais où...

    Quelle est donc la meilleure solution pour faire ce système d'ouverture de connexion bd au début d'une requête web et fermeture de la connexion lors de la réponse au client ?

    Merci d'avance,

    Jérôme.

    tu porrais utiliser le cache:

    SqlConnection connection=new SqlConnection(...);
    HttpContext.Current.Cache.Insert("connection",connection,...);
    on ajoutant comme dernier parametre a cette methode, l'instance d'un delegué pour gerer l'evenement de la suppression de l'element du cache.

    au fait c simple, a chaque fois que l'element (Connection BD),est supprimé du cache, on crée une nouvelle connection qu'on insere dans le cache.

  3. #3
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Oui bien sûr mais ça ne résoudrait pas le problème lors d'une requête web : A quel moment établir la connexion et à quel moment la fermer.

    Dans le projet en question, la connexion à la bd ne doit pas rester en permanence ouverte.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    des que tu as besoin d'un connection tu l'ouvres et tu la fermes tout bonnement.

  5. #5
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Cela oblige d'écrire le code de connexion et déconnexion à chaque fois.
    Dans le projet en question, cela ne doit être fait qu'une seule et unique fois par requête web.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    tu utilises des transactions?

  7. #7
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Citation Envoyé par rattlehead
    tu utilises des transactions?
    Non, pourquoi ?

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    En fait je viens de regarder. nous on gére la fermeture ou l'ouverture d'une connexion grace aux objets IDbTransaction et DbCommand.
    En fait tu te crées tes propres classe DBTransaction et DBCommand qui hérite de IDisposable. tu implémente la méthode Dispose que tu vas forcément appelé ou si tu passes par un using .Net appelera cette méthode. Dans cette méthode tu fermes la connexion. Pour ce qui est de l'ouverture de la connexion soit c'est ton constructeur de DBTransaction qui le fait si tu utilises des transactions soit c'est dans l'objet DBCommand que tu le fais via une méthode privée qui s'appelerait par exemple initConnection.

    j'avoue que c'est un peu indigeste tout ce que je viens de te raconter.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    Tu peux aussi te bricoler une classe utilitaire
    Avec une méthode SqlSelect( string ConStringName, string sql ) qui ferait :
    1. Récupérer la connectionString du web.config
    2. ouvre la connection
    3. execute la requête
    4. stocke le résultat dans un dataset qui sera retourné
    5. Ferme la connection
    6. retourne le dataset

    Si tu veux j'ai le code qui traine quelque part

  10. #10
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Si la solution de classe utilitaire t'interesse (je n'utilise pas "encore" le global.asax ), tu pourrais avoir une classe possédant du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Utilitaire
    {
       private IConnection _connection = null;
     
       public IConnection Connection
       {
           if(_connection == null) // => on crée l'objet en question
           return _connection; 
       }
    }
    Ensuite, tu peux gérer cà avec le cache de sorte que pour commencer un traitement, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using(Utilitaire.NewInstance())
    {...}
    où NewInstance est une fonction statique qui instance un nouvel objet connection et le détruit automatiquement après (en occurence grâce à la clause using...

    Bien sûr dans NewInstance, tu peux coder tout ce que tu veux pour gérer les objets dans le cache etc...

Discussions similaires

  1. [11g] Problème de connexion lors d'une requête
    Par bernards111 dans le forum Connexions aux bases de données
    Réponses: 1
    Dernier message: 25/02/2015, 17h35
  2. Connexion Access-MySQL- A quel moment?
    Par quentin57 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/05/2010, 13h10
  3. Réponses: 4
    Dernier message: 02/04/2009, 20h56
  4. quel equipement pour partager ma connexion?
    Par unix27 dans le forum Développement
    Réponses: 2
    Dernier message: 13/11/2005, 16h05
  5. [Compilation] A quel moment pour une application ?
    Par Rick1602 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/03/2004, 20h36

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