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

Framework .NET Discussion :

[VS.net 2005] Question philosophique sur les objets


Sujet :

Framework .NET

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut [VS.net 2005] Question philosophique sur les objets
    Bonjour à tous,

    J'ai une application pour laquelle j'essaie de coller au maximum à l'orienté objet. Je développe donc principalement sous forme de classes.

    Chaque classe nécessite d'aller vérifier des informations dans une base de données SQL.

    Ma question philosophique serait de savoir
    - s'il est préférable que chaque objet se connecte lui même à la base de données SQL (le new recevrait les informations pour se connecter)
    - s'il est préférable que je transmette une référence à un objet SQL connection déjà instancié et connecté ?

    Dans le premier cas, je risque d'avoir un grand nombre de connections à SQL alors que dans le second cas j'en aurais une seule.
    Sachant que chaque fois que je fait un new sur un objet je dois lui transmettre ces informations.

    Quelle autre solution s'offre à moi?

    Merci par avance.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu peux passer par une classe DAL qui va se charger de tous ce qui touche à la base de données. Ensuite, tes classes utiliseront cette DAL: ainsi, tu n'as qu'une classe qui se "connecte" à la base.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Qu'est-ce que DAL?

    En fait, j'ai déjà une classe qui gère les aspects connections SQL selon l'environnement utilisateur et cette classe contient l'objet de connection SQL.
    C'est cette classe que je passe à mes objets actuellement.

    Le soucis qui se pose assez fréquement c'est que plusieurs objets font des appels vers SQL en même temps (threads) et je reçois très souvent des erreurs types "There is alread an open dataReader associated with this connection).
    Je suis sous SQL 2000 et ne peut donc pas paramètrer ma base pour accepter plusieurs dataReader.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Si tu ouvres et tu fermes la connexion à la base uniquement lorsque tu en as besoin, tu ne devrais pas avoir ce genre de problème.


    A te lire, je dirais qu'il faut revoir l'architecture de ton application car si tu as plusieurs thread qui accède en même temps à la base, c'est que:
    - ou c'est normal et voulu: c'est comme cela que fonctionne ton application, dans ce cas, je suggère la mise en place d'un pool pour éviter des erreurs telles que tu as
    - ce n'est pas normal et il faut re-prenser l'archi de ton appli pour n'avoir qu'une classe qui se connecte, dans un seul thread.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Tu peux créer une classe de connexion à ta base qui fonctionne en Singleton... l'intérêt c'est que tu garantie l'unicité de la classe en mémoire. Donc une seule et unique connexion. L'autre c'est que du coup tu n'est pas obligé de fournir la référence à l'instance à chaque fois que tu créé un classe métier.

    Maintenant il y a plusieurs voies pour créer une classe en singleton. Tu peux aussi créer ta classe d'accès aux DB entièrement statique, mais ce n'est pas très propre... bien que tout dépend de ton architecture, mais si tu as besoin pour X raisons d'en instancier une exceptionnelle supplémentaire... tu ne peux plus.

    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
     
    public class DbAccess {
    private static DbAcess s_Singleton = new DbAccess();
    private static object s_Locker = new object();
     
    private DbAccess() {
    ...
    }
     
     
    public static DbAccess Instance { get { lock (s_Locker) return s_Singleton; } }
     
    ...
     
    }
    Voilà en plus ta un singleton qui est thread-safe

  6. #6
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    J'ai deja brievement repondu a ta question sur un autre de tes topics.

    En fait si tu referme suffisament vite les connection successives, tu n'en utilisera en realite qu'une seule. Ado.Net utilise un cache pour les connections a la base de donnees.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Je commence à comprendre l'idée.

    Pour définir un pue le contexte, j'ai ceci:

    - Une classe de ocnnexion à SQL qui défini la chaîne de connexion différement selon certains paramètres
    - Une classe graphique, qui hérite de panel, pour afficher un compactus (étagère de stockage d'archives)
    - Cette classe graphique contient une classe métier instanciée au new
    La classe métier va chercher dans SQL si le compactus existe et stocke des infos sur ce dernier
    Ces infos seront exploitée par la classe graphique compactus pour afficher ces données

    Une form principale parcoure une liste de compactus, instancie l'objet graphique compactus qui instancie l'objet métier compactus.

    Donc dans ma form j'ai quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for each ...
         Dim oGCompactus As New clsGraphicCompactus(G_oSQLconnection, pIDdepot, pIDcompactus)
         oGCompactus.Left = leftPosition
         oGCompactus.Top = topPosition
         Me.pnlCompactus.Controls.Add(oGCompactus)
         'Gestion de l'évènement doubleClick
         AddHandler oGCompactus.doubleClicked, AddressOf compactusDoubleClicked
    next
    On voit ici que je passe l'objet sqlConnection instancié au démarrage de l'application.
    La classe graphique le transmet ensuite à la classe métier. Qui a dis que je me compliquais la vie? Je veux un nom

    La classe métier à une méthode update qui est lancée dans un BGworker pour des raisons de performances.

    Disons qu'en réfléchissant mieux, j'arrive à échapper é l'erreur citée dans mon premier post mais cela reste ardu.

    Si vous avez des remarques sur ma logique, je suis preneur et prêt à vous écouter.

    Encore merci pour vos réponses très utiles.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    tu peux avoir plusieurs dataread sur une connexion... A conditions de multiplier les TRANSACTIONS... Si tu isole une execution de lot SQL dans une transaction, pour peut que tu les définissent TOUTES en set isolation level Serializable, et tes threads ne pourrons pas accèder directement au meme données, ni d'un point de vue ADO ni d'un vue DB.

    Parce que personnellement j'ai une application qui créer des threads en veuxtu en voila, jusque plus de 700 par moments qui accèdents tous à la base quasisimultannément, et je n'ai jamais eu ce problème, enfin bon...

    Il existe une autre solution... créer un nouvel objet SqlConnexion... techniquement ils vont utiliser la meme connexion physique, mais tu pourra quand meme attribués plusieurs lots SQL simultannéments.
    Tout est affaire de contexte...

    Je nai jamais eude probleme et pourtant j'utilise SQL 2000 en production... et même en développement d'ailleurs.

  9. #9
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    En suivant tes réponses sur les deux posts que j'ai lancé, je viens de faire une simulation avec le code suivant:

    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
    Private _strConnectionString As String = "blablabla"
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer
            For i = 0 To 100
                Dim bgwOperations As New System.ComponentModel.BackgroundWorker
                AddHandler bgwOperations.DoWork, AddressOf bgwOperations_DoWork
                AddHandler bgwOperations.RunWorkerCompleted, AddressOf bgwOperations_RunWorkerCompleted
                bgwOperations.RunWorkerAsync()
            Next
        End Sub
        Private Sub bgwOperations_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            getEspaceRestant()
        End Sub
        Private Sub bgwOperations_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
            Me.ListView1.Items.Add("COUCOU")
        End Sub
     
        Public Function getEspaceRestant() As Integer
            Try
                Dim oconnection As SqlConnection
                oconnection = New SqlConnection(_strConnectionString)
                oconnection.Open()
                Dim oCommand As New SqlCommand("grosse requete de plus d'1 seconde", oconnection)
                Return oCommand.ExecuteScalar()
                oconnection.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            End Try
        End Function
    Ca fonctionne nikel pendant quelques itérations puis il me signale que mon pool est rempli.
    Il n'a pas l'air de réutiliser la connection car si je vais dans le query analyzer et que je regarde dans exec SP_WHO, je vois des connections qui s'ouvre à chaque itération.

    Si j'abuse pas, pourrais-tu me guider sur les erreurs de mon code?En tout cas j'ai plus d'erreur datareader already open.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

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

Discussions similaires

  1. Question philosophique sur les "access level modifiers"
    Par Gugelhupf dans le forum Général Java
    Réponses: 6
    Dernier message: 30/07/2014, 10h52
  2. question philosophique sur les champs
    Par stagolee dans le forum Modélisation
    Réponses: 3
    Dernier message: 20/08/2008, 11h14
  3. Réponses: 3
    Dernier message: 04/04/2008, 18h02
  4. [VB.NET 2005] Propriété opacity sur un objet
    Par ricil78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/04/2007, 11h11
  5. Réponses: 5
    Dernier message: 24/04/2005, 04h09

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