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

C# Discussion :

[ADO.Net - ASP.net] connexion multiple et singleton design pattern


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut [ADO.Net - ASP.net] connexion multiple et singleton design pattern
    Bonjour,

    J'ai développé un site web en ASP.net - C# qui travaille avec une base de données. Le site fonctionne très bien, sauf lorsqu'il ya deux utilisateurs en même temps ... C'est un problème :-) !!

    J'ai une classe qui me permet de créer ma connexion à la base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
        /// <summary>
        /// Classe permettant l'accès à la base de données 
        /// </summary>
        /// <remarks>Cette classe se base dur DBFactory. 
        /// Par conséquent, la connexion peut s'effectuer sur différents type de base de données.</remarks>
        public class DBAccess
        {
            #region Variables privées
     
            /// <summary>
            /// Connexion à la base de données
            /// </summary>
            private DbConnection dbConnection = null;
     
            /// <summary>
            /// Chaine de connexion à la base de données 
            /// </summary>
            private ConnectionStringSettings connectionStringSettings;
     
            /// <summary>
            /// Instance de connexion liée à la base de données
            /// </summary>
            private static DBAccess gtmInstance;
     
            /// <summary>
            /// Verrou sur l'instance de connexion
            /// </summary>
            private static object gtmInstanceLocker = new object();
     
            #endregion
     
            #region Propriétés
     
            /// <summary>
            /// Chaine de connexion vers la base de données 
            /// </summary>
            public ConnectionStringSettings ConnectionStringSettings
            {
                get { return connectionStringSettings; }
                set { connectionStringSettings = value; }
            }
     
            /// <summary>
            /// Propriété permettant de récupérer l'instance de connexion à la base de 
            /// données
            /// <remarks>Utilise le singleton pattern</remarks>
            /// </summary>
            public static DBAccess Instance
            {
                get
                {
                    lock (gtmInstanceLocker)
                    {
                        if (gtmInstance == null)
                            gtmInstance = new DBAccess();
     
                        return gtmInstance;
                    }
                }
            }
     
            #endregion
     
            #region Méthodes publiques
     
            /// <summary>
            /// Méthode permettant la récupération de la connexion à la base de données ouverte
            /// </summary>
            /// <returns>La connexion à la base de données</returns>
            public DbConnection getDataBaseConnection()
            {
                DbProviderFactory factory = null;   // -- DataBase provider
     
                try
                {
                    // -- Récupération du type de base de données en fonction
                    // -- de la chaine de connexion
                    // ------------------------------------------------------
                    factory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
     
                    // -- Création de la connexion
                    // ---------------------------
                    if (dbConnection == null)
                        dbConnection = factory.CreateConnection();
     
                    // -- Renseignement de la chaine de connexion
                    // ------------------------------------------
                    if (dbConnection.State == ConnectionState.Closed)
                        dbConnection.ConnectionString = ConnectionStringSettings.ConnectionString;
     
                    // -- Ouverture de la connexion si cette dernière est fermée
                    // ---------------------------------------------------------
                    if (dbConnection.State == ConnectionState.Closed)
                        dbConnection.Open();
                }
                catch (Exception ex)
                {
                    throw new Exception("GTMAccess.getDataBaseConnection : " + ex.Message + "\n");
                }
     
                return dbConnection;
            }
    Ensuite j'ai développé mes classes qui permettent l'accès aux données (DAL) dans lesquelles je fais des choses de ce genre la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    try
    {
    using (DbConnection dbConnection = DBAccess.Instance.getDataBaseConnection())
          {
              return getAllThemes(includeSubFolders, dbConnection);
          }
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message + "\n");
    }
    Le hic c'est que lorsque deux utilisateurs se connecte et effectuent des opérations sur le site... J'ai des message d'erreurs du style
    Un dataReader est déja ouvert.
    Est ce que vous comprenez ce qui se passe ???
    Merci.

  2. #2
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Le patern Singleton à justement pour vocation de ne pas permettre l'instanciation multiple d'un même objet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static DBAccess Instance
            {
                get
                {
                    lock (gtmInstanceLocker)
                    {
                        if (gtmInstance == null)
                            gtmInstance = new DBAccess();
     
                        return gtmInstance;
                    }
                }
            }
    Quel est le message d'erreur exact?
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  3. #3
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Il faudrait veiller à refermer ta connection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dbConnection.Close();

  4. #4
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jean-Michel Ormes Voir le message
    Il faudrait veiller à refermer ta connection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dbConnection.Close();
    Mon dieu cela m'avais échappé... Tu as ta réponse toute faite !
    Un de mes vieux proff me disait toujours, quand tu ouvre quelque chose, pense toujours à le fermer ! Ensuite tu réfléchira où placer le code... (accolade, instanciation...)
    Une astuce à ne pas oublier...
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

Discussions similaires

  1. suppression multiple asp.net/vb.net
    Par zdig10 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 04/10/2010, 16h24
  2. Réponses: 0
    Dernier message: 31/07/2009, 02h27
  3. Participez à la F.A.Q .NET ASP.NET Delphi.NET
    Par Jérôme Lambert dans le forum Contribuez
    Réponses: 0
    Dernier message: 05/12/2008, 00h00
  4. Participez à la F.A.Q .NET ASP.NET VB.NET
    Par Jérôme Lambert dans le forum Contribuez
    Réponses: 0
    Dernier message: 05/12/2008, 00h00

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