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 :

Singleton de connexion à la base de données


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut Singleton de connexion à la base de données
    Bonjour !

    J'ai implémenté pour mon application un Singleton de connexion à la base de données. Il fonctionnait apparemment bien, mais récemment je me suis aperçu qu'il produisait des erreurs. En gros, lorsque l'on clique sur un lien et que, pendant le chargement de la page, on clique sur un autre lien, j'ai parfois (pas systématiquement donc) une erreur qui me dit que, en gros, il y a déjà un DataReader d'ouvert et qu'il faut le fermer avant d'en ouvrir un autre.

    J'ai juste suivi les différents tutos qui expliquent comment faire un Singleton en C#, mon code n'a rien de spécial. J'ai juste ajouté deux fonction statiques pour gérer l'ouverture et la fermeture de la connexion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Ferme la connexion
    private static void CloseConnexion()
    {
      if (GetInstance().SqlConnection.State != ConnectionState.Closed)
        GetInstance().SqlConnection.Close();
    }
     
    //Ouvre la connexion
    private static void OpenConnexion()
    {
      CloseConnexion();
      GetInstance().SqlConnection.Open();
    }
    Je suppose donc que ma fonction Close ne ferme pas systématiquement le Datareader ouvert (vu qu'il ne peut y en avoir qu'un seul par objet sqlconnection), mais je ne vois pas vraiment comment régler le problème.

    Si quelqu'un a une idée...

    Merci !

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Un singleton pour une connexion à la base de données est une grosse erreur de conception, à fortiori dans un environnement ASP.NET intrinséquement multi-threadé.
    Chaque requête envoyée vers le serveur ASP.NET s'exécute dans son propre thread. Ta solution implique que tous les threads vont utiliser la même connexion. C'est pour cela que ton application plante.
    Supprime ton singleton et tout ira bien. Profites en pour donner un coup de jeune à ton composant d'accès aux données : http://johannblais.developpez.com/tu...acces-donnees/
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut
    Hm donc a priori je n'ai pas d'autre choix que d'utiliser une classe "normale" pour l'accès aux données, et de l'instancier à chaque fois ?
    Pour ce qui est des threads j'avais utilisé "lock" dans ma fonction GetInstance(), mais je suppose que ça ne suffit pas : p

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Gunny Voir le message
    Hm donc a priori je n'ai pas d'autre choix que d'utiliser une classe "normale" pour l'accès aux données, et de l'instancier à chaque fois ?
    Pour ce qui est des threads j'avais utilisé "lock" dans ma fonction GetInstance(), mais je suppose que ça ne suffit pas : p
    Regarde dans l'article que je t'ai donné, j'y explique comment créer une belle couche d'accès aux données.
    Concernant le lock, au mieux il ne sert à rien dans ton cas. Tu ne fais que garantir que deux threads n'accèdent pas en même temps à la variable. Mais cela n'empèche pas d'utiliser la même connexion pour plusieurs commandes en même temps.
    En plus même si tu arrivais à faire fonctionner le lock comme tu le souhaites, ce serait encore pire, puisque tu obligerais chaque requête à s'exécuter séquentiellement. Tu imagines l'horreur pour les utilisateurs.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut
    En effet

    A vrai dire, si j'avais le temps je modifierais mon application pour que l'accès aux données soit tout beau tout propre, mais il ne me reste qu'une semaine de stage, et je suis actuellement en phase de tests. Malheureusement, je dois me contenter d'une solution assez rapide et qui règle ces problèmes, étant donné la masse de procédures que je dois exécuter un peu partout.

    Je ne suis pas très fier de mon code, mais j'ai des circonstances atténuantes : p . Au moins je serai paré pour la prochaine appli à faire en .net

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

Discussions similaires

  1. Connexion à une base de données avec un singleton
    Par slake13 dans le forum Bases de données
    Réponses: 6
    Dernier message: 18/11/2008, 17h26
  2. ERREUR DE CONNEXION à une base de donnée ACCESS protégée
    Par unionriton dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/05/2005, 09h35
  3. Delphi Connexion à une base de donnée distante par TCP/IP
    Par viecel dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/01/2005, 19h19
  4. Echec lors de la connexion à la base de données.
    Par mclown dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 26/10/2004, 23h36
  5. Réponses: 3
    Dernier message: 29/03/2004, 18h02

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