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 :

[VB.NET] Débat sur la connexion, l'utilisation des requêtes


Sujet :

ASP.NET

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut [VB.NET] Débat sur la connexion, l'utilisation des requêtes
    Bonjour,


    J'ouvre ce sujet afin d'essayer d'optimiser un maximum mon application. J'aimerais également lever le flou qui pèse actuellement sur la prog en VB.NET

    Je développe pour un client qui m'impose le VB.NET. Notez que les programmeurs C# sont bienvenus !

    Je vais donc vous proposer ce que j'ai fait pour mon application. Je suis là pour apprendre et être critiquer. N'hésitez surtout pas à me demander pourquoi j'ai fait ça, je ne manquerai pas de vous répondre si je le peux.

    Nota Bene sur le code que je vous présente :
    ne pas t'attarder sur la ligne de code Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant) ou toute ligne commençant par Erreur.Ecrire.
    Cette ligne me permet d'écrire une log comme je le veux.


    J'ai créé une classe nommée Sad (eheh oui clin d'oeil @ mon pseudo ). Voici le code de cette classe :

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
     
     
    Imports System.Data, System.Data.SqlClient
     
    Public Class Sad
     
      Public Function RQ_Maj(ByVal MaRequete As String)
        Dim cmd As SqlCommand
        Dim cnx As SqlConnection
     
        Try
            ' Construction de la cnx
            cnx = New SqlConnection
            cnx.ConnectionString = modConfig.ChCnx
     
            ' Ouverture d'une connexion
            cnx.Open()
            If (cnx.State = ConnectionState.Open) Then
                modTrace.TracerSQL("Connexion temporaire réussie sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
            Else
                modTrace.TracerSQL("Connexion temporaire échouée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
            End If
     
            ' Commande
            cmd = New SqlCommand(MaRequete, cnx)
            cmd.CommandType = CommandType.Text
     
            ' Execution de la requête
            modTrace.TracerSQL("Tentative d'exécution de la requête (Update, Insert, ou Delete) : " & MaRequete, Connexion.IP, Connexion.LoginNT)
            cmd.ExecuteNonQuery()
            modTrace.TracerSQL("Exécution de la requête réussie (Update, Insert, ou Delete) : " & MaRequete, Connexion.IP, Connexion.LoginNT)
     
        Catch ex As Exception
            modTrace.TracerSQL("ERREUR sur l'exécution de la requête (" & MaRequete & ")" & ". Erreur : " & ex.Message & ". " & ex.StackTrace, Connexion.IP, Connexion.LoginNT)
            Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant, MaRequete, Connexion.IP, Connexion.LoginNT)
        Finally
            ' Fermeture de la commande
            cmd = Nothing
            ' Fermeture de la connexion
            If Not (cnx Is Nothing) Then
                cnx.Close()
                cnx.Dispose()
                cnx = Nothing
            End If
            If Not (cnx Is Nothing) Then
                modTrace.TracerSQL("Connexion temporaire fermée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
            End If
        End Try
      End Function
     
      ' ---------------------------------------------------
      ' Retourne un nombre
      ' -----------------------------------------------------
      Public Function RQ_Scal(ByVal MaRequete As String)
        Dim cmd As SqlCommand
        Dim cnx As SqlConnection
     
        Try
            ' Construction de la cnx
            cnx = New SqlConnection
            cnx.ConnectionString = modConfig.ChCnx
     
            ' Ouverture d'une connexion
            cnx.Open()
            If (cnx.State = ConnectionState.Open) Then
                modTrace.TracerSQL("Connexion temporaire réussie sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
            Else
                modTrace.TracerSQL("Connexion temporaire échouée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
            End If
     
            ' Commande
            cmd = New SqlCommand(MaRequete, cnx)
            cmd.CommandType = CommandType.Text
     
            ' Execution de la requête
            modTrace.TracerSQL("Tentative d'exécution de la requête (Count) : " & MaRequete, Connexion.IP, Connexion.LoginNT)
            RQ_Scal = cmd.ExecuteScalar()
            modTrace.TracerSQL("Exécution de la requête réussie (Count) : " & MaRequete, Connexion.IP, Connexion.LoginNT)
     
      Catch ex As Exception
            modTrace.TracerSQL("ERREUR sur l'exécution de la requête (" & MaRequete & ")" & ". Erreur : " & ex.Message & ". " & ex.StackTrace, Connexion.IP, Connexion.LoginNT)
            Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant, MaRequete, Connexion.IP, Connexion.LoginNT)
      Finally
          ' Fermeture de la commande
          cmd = Nothing
          ' Fermeture de la connexion
          cnx.Close()
          cnx.Dispose()
          cnx = Nothing
          If (cnx Is Nothing) Then
              modTrace.TracerSQL("Connexion temporaire fermée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
          End If
      End Try
    End Function
     
    ' ---------------------------------------------------
    ' Renvoit un Dataview pour gérer les pages
    ' -----------------------------------------------------
    Public Function Page(ByVal MaRequete As String) As DataView
      Dim cmd As SqlDataAdapter
      Dim ds As DataSet = Nothing
      Dim dv As DataView = Nothing
     
      Try
            Connexion.Connexion()
            If (Connexion.ConnexionOuverte = False) Then
                Return Page2(MaRequete)
            End If
     
            ' Commande
            cmd = New SqlDataAdapter(MaRequete, gCon)
     
            If Not (cmd Is Nothing) Then
                ds = New DataSet
                ' Execution de la requête
                modTrace.TracerSQL("Tentative d'exécution de la requête : " & MaRequete, Connexion.IP, Connexion.LoginNT)
                cmd.Fill(ds)
                modTrace.TracerSQL("Exécution de la requête réussie (" & MaRequete & ")", Connexion.IP, Connexion.LoginNT)
            End If
            cmd = Nothing
            If Not (ds Is Nothing) Then
                If Not (ds.Tables(0) Is Nothing) Then
                    Return New DataView(ds.Tables(0))
                Else
                    Return Nothing
                End If
            Else
                Return Nothing
            End If
      Catch ex As Exception
            cmd = Nothing
            Connexion.Deconnexion()
            ' Essayons de force l'exécution de cette requête sur une nouvelle connexion
            Select Case ex.Message
                Case "Un DataReader associé à cette connexion est déjà ouvert, il doit être tout d'abord fermé.", _
                            "La référence d'objet n'est pas définie à une instance d'un objet."
                        ex = Nothing
                        Return Page2(MaRequete)
                Case Else
                        modTrace.TracerSQL("ERREUR sur l'exécution de la requête (" & MaRequete & ")" & ". Erreur : " & ex.Message & ". " & ex.StackTrace, Connexion.IP, Connexion.LoginNT)
                        Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant, MaRequete, Connexion.IP, Connexion.LoginNT)
            End Select
      Finally
            If (Not ds Is Nothing) Then
                ds = Nothing
            End If
      End Try
    End Function
     
        ' ---------------------------------------------------
        ' Renvoit un Dataview pour gérer les pages
        ' -----------------------------------------------------
        Public Function Page2(ByVal MaRequete As String) As DataView
     
            Dim cnx As SqlConnection
            Dim cmd As SqlDataAdapter
            Dim ds As DataSet = Nothing
            Dim dv As DataView = Nothing
     
            Try
     
                ' Construction de la cnx
                cnx = New SqlConnection
                cnx.ConnectionString = modConfig.ChCnx
     
                ' Ouverture d'une connexion
                cnx.Open()
                If (cnx.State = ConnectionState.Open) Then
                    modTrace.TracerSQL("Connexion temporaire réussie sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
                Else
                    modTrace.TracerSQL("Connexion temporaire échouée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
                End If
     
                If (cnx.State = ConnectionState.Open) Then
     
                    ' Commande
                    cmd = New SqlDataAdapter(MaRequete, cnx)
     
                    If Not (cmd Is Nothing) Then
     
                        ds = New DataSet
     
                        ' Execution de la requête
                        modTrace.TracerSQL("Tentative d'exécution de la requête : " & MaRequete, Connexion.IP, Connexion.LoginNT)
                        cmd.Fill(ds)
                        modTrace.TracerSQL("Exécution de la requête réussie (" & MaRequete & ")", Connexion.IP, Connexion.LoginNT)
     
                    End If
     
                    cmd = Nothing
     
                    If Not (ds Is Nothing) Then
                        If Not (ds.Tables(0) Is Nothing) Then
                            Return New DataView(ds.Tables(0))
                        Else
                            Return Nothing
                        End If
                    Else
                        Return Nothing
                    End If
     
                End If
     
            Catch ex As Exception
     
                cmd = Nothing
                Connexion.Deconnexion()
     
                modTrace.TracerSQL("ERREUR sur l'exécution de la requête (" & MaRequete & ")" & ". Erreur : " & ex.Message & ". " & ex.StackTrace, Connexion.IP, Connexion.LoginNT)
                Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant, MaRequete, Connexion.IP, Connexion.LoginNT)
     
            Finally
                If (Not ds Is Nothing) Then
                    ds = Nothing
                End If
     
                ' Fermeture de la connexion
                cnx.Close()
                cnx.Dispose()
                cnx = Nothing
     
                If (cnx Is Nothing) Then
                    modTrace.TracerSQL("Connexion temporaire fermée sur " & modConfig.Serveur, Connexion.IP, Connexion.LoginNT)
                End If
     
            End Try
     
        End Function
     
    End Class
    L'accés à la base de données se fait via le module 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
    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
     
     
     
    Public Module Connexion
     
        Public session As System.Web.SessionState.HttpSessionState
     
        Public gCon As SqlConnection
        Public IP As String
        Public LoginNT As String
     
        ' -----------------------------------------
        ' Création d'une connexion
        ' -----------------------------------------
        Public Function Connexion() As SqlConnection
     
            Dim ChneCnx As String
     
            Try
                ' retrouve la clé pour la connexion
                ChneCnx = modConfig.ChCnx
     
                If (gCon Is Nothing) Then
                    ' construit la cnx
                    gCon = New SqlConnection
                    gCon.ConnectionString = ChneCnx
                End If
     
                ' ... et l'ouvre
                If Not (gCon.State = ConnectionState.Open) Then
                    gCon.Open()
                    If (gCon.State = ConnectionState.Open) Then
                        'modTrace.TracerSQL("Connexion réussie  sur " & modConfig.Serveur, IP, LoginNT)
                    Else
                        'modTrace.TracerSQL("Connexion échouée  sur " & modConfig.Serveur, IP, LoginNT)
                    End If
                End If
     
                ' retourne la cnx
                Return gCon
     
            Catch ex As SqlException
                'modTrace.TracerSQL("Erreur (" & ex.Message & ") dans la connexion sur " & modConfig.Serveur, IP, LoginNT)
                Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant)
            End Try
     
        End Function
     
        ' -----------------------------------------
        ' Fermerture d'une connexion
        ' -----------------------------------------
        Public Sub Deconnexion()
            Try
                If Not (gCon Is Nothing) Then
                    If Not (gCon.State = ConnectionState.Closed) Then
                        'modTrace.TracerSQL("Fermeture de la connexion sur " & modConfig.Serveur, IP, LoginNT)
                        gCon.Close()
                        If (gCon.State = ConnectionState.Closed) Then
                            '   modTrace.TracerSQL("Connexion fermée sur " & modConfig.Serveur, IP, LoginNT)
                        End If
                    End If
                End If
     
            Catch ex As SqlException
     
                'modTrace.TracerSQL("Erreur (" & ex.Message & ") dans la déconnexion sur " & modConfig.Serveur, IP, LoginNT)
     
                Erreur.Ecrire(ex, Erreur.enLogicielErreur.leComposant)
            Finally
     
            End Try
     
        End Sub
     
        Public Function ConnexionOuverte() As Boolean
            If (gCon Is Nothing) Then
                Return False
            End If
            If (gCon.State = ConnectionState.Open) Then
                Return True
            Else
                Return False
            End If
        End Function
     
    End Module

    La classe Sad travaille donc avec le module Connexion. En fait, dès que je vais utiliser une méthode de la classe Sad, je vérifie si j'ai une connexion ouverte (dans le cas contraire, je me connecte @ la base). Parfois, j'intercepte des erreurs (voir un catch dans la méthode Page) et du coup, je me permet d'utiliser une 2nde connexion pour retenter la requête. J'ai appelé ceci dans mon jargon : Reprise sur connexion. En fait, j'ai remarqué que mon application est parfois gourmande. Donc si j'ai 2 utilisateurs connectés par exemple qui font appel à des fonctionnalités qui demandent des requêtes gourmandes, la méthode Page va être appelée par chaque utilisateur par exemple et le temps que l'une s'exécute à un moment "t", l'autre méthode Page appelée par un autre utilisateur va du coup être refoulé et j'intercepte cette erreur et appelle une méthode page2 sur une nouvelle connexion temporaire. Je ne vous cache pas que : Ca marche bien.

    J'ai rencontré un autre problème. J'ai parfois l'erreur : le délair d'attente est dépassé (erreur remontée par ma log d'erreur, celle ci me remonte l'utilisateur qui a déclenché l'erreur ainsi et surtout la requête en erreur). Quand je teste ma requête, celle-ci n'est pas une requête gourmande, ces erreurs sont aléatoires et peuvent se produire sur n'importe quel requête.

    J'en ai déduit que c'est une requête précédente qui fait planter la prochaine requête. J'en suis venu à penser que : utiliser un module de connexion revient (selon le code que je vous présente) à partager une connexion entre plusieurs utilisateurs connectés. En gros, j'ai l'impression qu'un utilisateur qui va appelé une méthode quelque part dans mon application qui sollicite une requête gourmande va faire planter les prochaines requêtes car la connexion en cours est occupée à répondre à cette requête demande et du coup, les autres requêtes attendent que la connexion soit libérée.

    J'espère que ma description du projet est assez claire et que nous pourrons discuter ensemble du chemin à suivre.

    Bien cordialement...
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Moi j'ouvre puis je ferme une nouvelle connexion pour chaque requête à effectuer

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    Lorsque j'ai débuté, c'est ce qu'on avait déconseillé mais je me suis vite rendu compte que le pool de connexion était atteint :o

    Imagine un peu : 300 utilisateurs se connectent (c'est le cas de mon application en fait) : certaines pages doivent avoir 4-5 requêtes (ce n'est pas énorme) mais imagine 300 utilisateurs * 4-5 requêtes = 1200-1500 connexions ouvertes fermées.

    D'après mes recherches sur internet, le pool de connexion en DOT NET est auto implémenté ! Mais ca n'empêche pas que dans la console de SQL Server je vois le pool de connexion grossir et finalement lutecefalco, dot net me renvoit le message "Pool de connexion atteint" donc je ne sais pas si dot net gère bien le pool de connexion, mais perso, je ne trouve pas ça très bien...

    PS : Message perso pour lutecefalco : as tu vu le sujet pour Crystal ? Ca t'inspire ou pas :
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  4. #4
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    La connexion doit rester ouverte qqs centièmes de seconde, c'est pas gd chose

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    peut être, mais 300 users connectés en même temps, ca fait 300 connexions ouvertes... Je trouve ça énorme si je suis ta façon de faire (attention, j'essai de peser le pour & le contre ^^)

    En attendant avec ma solution, j'ai 2-3 connexions ouvertes et quand des requêtes sont trop gourmandes, j'ai cette erreur précisement :

    01/02/2006 11:18:53 126.176.116.70 (P006576) Erreur dans le composant Part Variable 2005 le 01/02/2006 11:18:53

    Message : Expiration du délai d'attente. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.

    Détail : at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
    at PV2005.Sad.Page2(String MaRequete) in C:\Inetpub\wwwroot\PV2005\_Divers\modSad.vb:line 254

    Requête : select distinct T_ES.CD_ES from T_MATRICES_ES, T_ES WHERE T_MATRICES_ES.CdEs =* T_ES.Cd_Es AND T_ES.CD_ES in (select CD_ES from T_TypeGrp WHERE CD_ESRGPT = '00038' AND CD_TYRGPT in ('01') AND DT_FINVAL is NULL)

    ---------------------------------------------------------------
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Je comprends pas comment tu pas avoir 2-3 connexions si t'as 300 users

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    j'en ai pas 300 forcément connectés actuellement... Mais il est succeptible d'en avoir 300

    Actuellement si je regard le pool sous SQL Server, j'ai 3-4 connexions pour une dizaine de users connectés @ un instant t
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  8. #8
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Sadneth
    j'en ai pas 300 forcément connectés actuellement... Mais il est succeptible d'en avoir 300

    Actuellement si je regard le pool sous SQL Server, j'ai 3-4 connexions pour une dizaine de users connectés @ un instant t
    J'ai bien compris mais si t'as 300 users en meme temps, comment ça se passe?

  9. #9
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour Sadneth
    As-tu le droit de modifier ta BDD SQL car tu gagnerais enormement en resources si tu implementais côté BDD des procedures stockées qui simplifierait le requêtage côté appli puisque le DataSet contiendrait toutes les données necessaires ensuite pour l'utilisateur pour le maximum de fonctionnalités durant sa session
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    lutecefalco : je ne sais pas encore. Le cas ne s'est pas produit. L'application concernée est un calcul financier sur l'intéressement. On va dire que le nombre de connectés simultanés maximum atteint @ ce jour est 20 et que le nombre de connexion dans le pool de sql server était 4.

    neguib : plus ca va, plus j'y pense ! Notamment pour les grosses requêtes, mais c'est clair que je suis nul sur ce point
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  11. #11
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Sadneth
    lutecefalco : je ne sais pas encore. Le cas ne s'est pas produit. L'application concernée est un calcul financier sur l'intéressement. On va dire que le nombre de connectés simultanés maximum atteint @ ce jour est 20 et que le nombre de connexion dans le pool de sql server était 4.

    neguib : plus ca va, plus j'y pense ! Notamment pour les grosses requêtes, mais c'est clair que je suis nul sur ce point
    Je vois pas pourquoi moi aussi j'aurai pas 4 connexions avec ma façon de procédée

  12. #12
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    je sais pas lutecefalco. Je suis pas expert dans le domaine & je cherche des réponses à mon flou.

    Mais ta façon de faire est la 1ère que j'eus mis en place lors de mes précédents projets et ce fut catastrophique

    Pool de connexion atteint
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  13. #13
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Sadneth
    je sais pas lutecefalco. Je suis pas expert dans le domaine & je cherche des réponses à mon flou.

    Mais ta façon de faire est la 1ère que j'eus mis en place lors de mes précédents projets et ce fut catastrophique

    Pool de connexion atteint
    Mouais, t'avais dû oublier des fermer des connexions qqpart non?

  14. #14
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    Non lutecefalco. Quand je code, lorsque j'ouvre un objet, la 1ère chose que je fait, c'est que je ferme et fait un nothing derrière
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  15. #15
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Sadneth
    Non lutecefalco. Quand je code, lorsque j'ouvre un objet, la 1ère chose que je fait, c'est que je ferme et fait un nothing derrière
    Un simple Close() devrait normalement suffire à liberer les ressources sousjascentes (donc plus besoin de Dispose() et Nothing, du moins il me semble)
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  16. #16
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    j'ai une erreur récurrente :

    02/02/2006 16:33:01 126.176.115.87 (P010869) ERREUR sur l'exécution de la requête (select distinct T_ES.CD_ES from T_MATRICES_ES, T_ES WHERE T_MATRICES_ES.CdEs =* T_ES.Cd_Es AND T_ES.CD_ES in (select CD_ES from T_TypeGrp WHERE CD_ESRGPT = '00489' AND CD_TYRGPT in (01) AND DT_FINVAL is NULL)). Erreur : Expiration du délai d'attente. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.. at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
    at PV2005.Sad.Page2(String MaRequete) in C:\Inetpub\wwwroot\PV2005\_Divers\modSad.vb:line 210
    Si je regarde dans ma classe modSad, la ligne 210 est : cmd.Fill(ds) dans la procédure Page2. Si nous regardons le code présenté ci-dessus, Page2 est une méthode qui travaille sur une connexion temporaire (ouverte au plus tard et fermée au plus tôt). Qu'est-ce qui peut donc faire que ca rame comme ça : Comme vous constatez, la log d'erreur remonte la requête et lorsque j'exécute cette requête, bah celle ci se charge rapidemment bien sur, je dirai que c'est une requête de base quoi
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  17. #17
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    bah maintenant, je me paye cette erreur ci :

    Erreur irrécupérable de connexion interne
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  18. #18
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    bonjour,

    je reviens @ vous concernant mes problèmes de connexions.

    Actuellement, je suis parti sur le principe :

    -> J'ouvre une connexion au plus tard
    -> Je ferme une connexion au plus tôt

    Je ne vous cache pas que j'ai moins de problème.

    Cependant, j'en ai toujours et lorsque l'application plante, ce sont tous les utilsateurs qui en subissent les conséquences.

    Donc si je trace une erreur, j'ai :

    14/02/2006 17:53:12 126.176.114.70 P010034 Erreur dans le composant Part Variable 2005 le 14/02/2006 17:53:12

    Message : La référence d'objet n'est pas définie à une instance d'un objet.

    Détail : at System.Data.Common.Dbnetlib.ConnectionError(HandleRef pConnectionObject, IntPtr& netErr, IntPtr& netMsg, IntPtr& dberr)
    at System.Data.SqlClient.TdsParser.ProcessNetlibError(IntPtr errno)
    at System.Data.SqlClient.TdsParser.ReadNetlib(Int32 bytesExpected)
    at System.Data.SqlClient.TdsParser.ReadBuffer()
    at System.Data.SqlClient.TdsParser.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
    at System.Data.SqlClient.TdsParser.ReadEncodingChar(Int32 length, Encoding encoding)
    at System.Data.SqlClient.TdsParser.ReadValue(_SqlMetaData md, Int32 length)
    at System.Data.SqlClient.SqlDataReader.SeqRead(Int32 i, Boolean useSQLTypes, Boolean byteAccess, Boolean& isNull)
    at System.Data.SqlClient.SqlDataReader.SeqRead(Int32 i, Boolean useSQLTypes, Boolean byteAccess)
    at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values)
    at System.Data.Common.SchemaMapping.LoadDataRow(Boolean clearDataValues, Boolean acceptChanges)
    at System.Data.Common.DbDataAdapter.FillLoadDataRow(SchemaMapping mapping)
    at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
    at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
    at PV2005.Sad.Page(String MaRequete, Boolean bForce) in C:\Inetpub\wwwroot\PV2005\_Divers\modSad.vb:line 132

    Requête : select distinct T_ES.CD_ES from T_MATRICES_ES, T_ES WHERE T_MATRICES_ES.CdEs =* T_ES.Cd_Es AND (T_ES.N1 = '00046' OR T_ES.N2 = '00046' OR T_ES.N3 = '00046') UNION select distinct T_ES.CD_ES from T_MATRICES_ES, T_ES WHERE T_MATRICES_ES.CdEs =* T_ES.Cd_Es AND T_ES.CD_ES = '00046'
    Et la ligne 132 est : cmd.Fill(ds)

    où cmd est un objet de commande et ds un dataset.

    Comme toujours, je ne comprends pas pourquoi lorsqu'un utilisateur utilise l'application, qu'une requête va ramer, qu'un autre utilisateur va lui aussi ramer et l'application va rentrer en timeout au niveau de l'éxécution des requêtes...
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

  19. #19
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 152
    Points : 79
    Points
    79
    Par défaut
    Bon, je dirais que mon problème est résolu.

    J'ai changé quelque chose qui me permet de mieux gérer mes connexions.

    Je gérait mes connexions via un module que j'ai écrit. J'ai transformé ceci en Classe et ca marche bien. Je n'ai plus eu d'erreur depuis hier.

    Merci @ ceux qui ont sucité de l'intérêt à ce sujet
    ~ Sadneth ~

    Webmaster sur :
    http://www.lesacteursdelombre.com

    ~ Les cicatrices ont pour mérite de nous rappeler que le passé n'est pas un rêve ~

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

Discussions similaires

  1. IKVM sur un projet libraire utilisant des librairies
    Par Celes Eternal dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 28/05/2013, 10h27
  2. Réponses: 2
    Dernier message: 17/08/2009, 12h13
  3. Réponses: 0
    Dernier message: 09/06/2008, 11h19
  4. Utilisation des requêtes SNMP
    Par Général03 dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/05/2007, 23h09
  5. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00

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