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] Gestion pool de connexions....


Sujet :

ASP.NET

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut [VB.NET] Gestion pool de connexions....
    Bonjour,

    Je gère une application en VB.net et ASPx.
    Celle-ci fait des connexions (beaucoup) à un serveur SQL Server via une DLL COM+ développée en VB sur laquelle je n'ai pas la main. J'utilise juste la DLL.


    Le problème c'est que ces connexions ne sont pas détruite et donc s'accumulent.

    j'ai donc effectué plusieurs tests et le code de l'application est bon, la connexion n'est ouverte uniquement lorsqu'on en a besoin et refermée derriere mais pourtant elle persiste.

    Ce qui est etrange, c'est que j'ai refait le meme code dans un projet exe (donc pas web) les connexions sont bien tuées.

    Ce qui m'amène a penser qu'avec ASPx, il y a un pool de connexion qui est géré sur le serveur IIS et qui garde les connexions sous le coude, au cas ou... si on peut parler ainsi.

    Ce qui expliquerait avec un exe, pas de connexion vacante, avec IIS oui.

    j'ai d'ailleurs trouvé un post sur cela:

    Microsoft conseille d'ouvrir une connection a une db le plus tard possible et de la fermer le plus tot possible.

    Les tests que j'ai fait m'on prouve que c'etait vrai. Il n'est pas interessant d'avoir une connection toujours ouverte (de plus ca devient le casse-tete pour les datareaders qui exigent une connection pour eux tous seuls)

    En fait les connections a la base de donnees sont mises dans une sorte de cache, ca s'apelle le connection pooling. Et ca marche assez bien.

    Attention pour recuperer des connections mises en cache dans le pool, il faut garder exactement la meme connectionstring (espaces compris!)! sinon il ne recupere pas les connections en cache, mais en cree une nouvelle


    J'aimerais donc savoir si vous avez des info sur ces pool de connexion et si ma reflexion est juste. Si vous avez de la doc ou des liens...
    comment augmenter ce pool, comment tuer les connexions qu'il contient etc...


    Biensur je cherche de mon coté.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Vu que tu utilises des objets d'une DLL COM, tu as essayé de les détruire avec Marshal.ReleaseComObject ?
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  3. #3
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    C'est marrant, suite aux postes de ces derniers jours, je commence aussi à plancher dessus !
    Voici un lien que j'ai trouvé interessant ( visite aussi les liens qui y sont référencés).
    http://blogs.telussa.com/danwatts/ar...10/26/208.aspx

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Maniak
    Vu que tu utilises des objets d'une DLL COM, tu as essayé de les détruire avec Marshal.ReleaseComObject ?
    euh non je ne connais pas cette fonction, je vais me renseigner dessus, si tu as des infos ....

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Pete
    C'est marrant, suite aux postes de ces derniers jours, je commence aussi à plancher dessus !
    Voici un lien que j'ai trouvé interessant ( visite aussi les liens qui y sont référencés).
    http://blogs.telussa.com/danwatts/ar...10/26/208.aspx
    merci je vais consulter.
    Mais c'est assez critique car l'application est inexploitable... j'ai une erreur asp

    Il faut vraiment que je trouve une solution.
    La plus facile serait d'augmenter le nombre de connexion dans le pool... mais j'aimerais plutot pouvoir les détruire au fur et a mesur.

    merci de votre aide

  6. #6
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    D'après ce que j'ai compris, tu peux configurer ton pool de connexions avec la ConnectionString : tu peux l'activer, la déscativer...
    Regarde ceci :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconConnectionPoolingForSQLServerNETDataProvider.asp
    Enfin je ne pense pas que IIS influe la dessus.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Pete
    Enfin je ne pense pas que IIS influe la dessus.
    c'est a dire ? tu ne penses pas que c'est a cause de IIS que j'ai ces connexion persistantes ? mais pourquoi alors avec un exex simple ca ne me le fait pas ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Sinclair
    Citation Envoyé par Maniak
    Vu que tu utilises des objets d'une DLL COM, tu as essayé de les détruire avec Marshal.ReleaseComObject ?
    euh non je ne connais pas cette fonction, je vais me renseigner dessus, si tu as des infos ....
    Bah y a pas grand chose à dire là-dessus. C'est un peu le Dispose des objets COM. Tu crées un objet COM, tu appelles Marshal.ReleaseComObject quand tu as fini et ça détruit tout. Ça décrémente le compteur de référence de l'objet COM, et vu que le wrapper .NET n'utilise qu'une seule référence, ça vire tout. Sans attendre que le garbage collector décide de s'en occuper.

    Si ton problème vient de la connexion dont des ressources restent allouées par un objet COM, c'est ta meilleure chance de tout remettre en ordre. Si ça vient d'ailleurs, ça ne servira à rien. Mais ça ne fait pas de mal et c'est vraiment comme Dispose : l'appeler systématiquement est fortement recommandé :)

    Ah, et IIS n'a pas de gestion de connexions aux bases de données. C'est pas son job.

    La différence de comportement entre appli web et appli win peut notamment venir du fait qu'une appli win a une portée bien plus réduite. C'est pour 1 utilisateur, et quand il en a terminé avec, toutes les ressources qui trainent sont libérées. Une appli web tourne non-stop, sert à tous les utilisateurs, et les ressources qui trainent continuent de trainer jusqu'au jour où le garbage collector passe par là.

    D'où l'intérêt des méthodes Dispose/Marshal.ReleaseComObject, pour donner un coup de main au GC.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    hhhhmmm il faut inclure une librairie spéciale ? cette fonction n'est pas reconnue chez moi

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Sinclair
    hhhhmmm il faut inclure une librairie spéciale ? cette fonction n'est pas reconnue chez moi
    System.Runtime.InteropServices :)

    Cf MSDN quoi, y a plein de trucs dans la classe Marshal pour les jonglages avec des objets COM :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  11. #11
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    ok merci je regarde ca tout de suite j'etais deja sur msdn.
    Je test et je vous tiens au ju

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    En fait je galere un peu.

    Je vous explique la structure du code.

    toutes les pages héritent d'une classe qui utilise la librairie com+ importée en référence. Cette classe que je nommerai ClasseMere. Ma reference com s'appelle PAD.

    Voici son contenu en schématisant :


    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
     
    Public Class ClasseMere
     
    Private objPAD As PAD.Directory
     
    ' une propriété qui est utilisée apres dans les pages
    'qui héritent, c'est grace a celle ci que les classes filles 
    'utilisent la connexion
    Protected ReadOnly Property oPAD() As PAD.Directory
     
            Get
                If oPAD Is Nothing Then
                    If Me.objPAD Is Nothing Then
                        Me.objPAD = New PAD.Directory
                        Me.objPAD.Server = Configuration.PADServeur
                        Me.objPAD.Login = Session("LoginPerson")
                        Me.objPAD.Password = Session("PasswordPerson")
                    End If
                    oPAD = Me.objPAD
                End If
            End Get
        End Property
     
    End Class
    et l'exemple d'une page aspx qui fait appel a cette connexion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class pagetest
        Inherits ClasseMere
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.oPAD().Application = Me.oPAD().Applications("monappli")
        End Sub
    End Class
    c'est cette connexion qui reste vacante ... (mais bon il y en a bcp d'autres c'est juste un exemple.)

    en fait je ne vois pas vraiment comment placer la commande ReleaseComObject...
    je vous avoue que je ne maitrise pas bien les propriété (pour la propriété oPAD() )

    si je fais ReleaseComObject(oPAD) a la fin de ma fonction load j'ai droit a un beau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object reference not set to an instance of an object
    est ce qu'il faut que j'applique le ReleaseComObject a oPAD ou a objPAD a votre avis ?

    si je l'utilise sur objPAD, je ne vois pas trop ou l'appeler puisque c'est un objet privé.

    Bref, si vous pouviez m'apporter un peu d'eclaircissement ca serait pas de refus.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Sinclair
    est ce qu'il faut que j'applique le ReleaseComObject a oPAD ou a objPAD a votre avis ?
    Ben avec le code que tu as mis là, je ne vois déjà pas comment la propriété fait pour passer la compilation.

    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
    Private objPAD As PAD.Directory
     
    ' une propriété qui est utilisée apres dans les pages
    'qui héritent, c'est grace a celle ci que les classes filles
    'utilisent la connexion
    Protected ReadOnly Property oPAD() As PAD.Directory
      Get
        If Me.objPAD Is Nothing Then
          Me.objPAD = New PAD.Directory
          Me.objPAD.Server = Configuration.PADServeur
          Me.objPAD.Login = Session("LoginPerson")
          Me.objPAD.Password = Session("PasswordPerson")
        End If
     
        Return Me.objPAD
      End Get
    End Property
    Citation Envoyé par Sinclair
    si je l'utilise sur objPAD, je ne vois pas trop ou l'appeler puisque c'est un objet privé.
    Au pire, tu fais un override de la méthode Dispose de ta classe et tu appelles ReleaseComObject dedans (*après* avoir vérifié que la variable n'est pas nulle, pour être sûr)

    Le Dispose de la page est appelé par le framework quand la page est détruite, c'est toujours mieux que de laisser le garbage collector se débrouiller.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  14. #14
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    alors concernant la propriété a été codée ... ce n'est pas moi qui l'ai faite donc je ne saurais te dire mais elle passe bien la compil' et elle fonction.
    Enfin je l'ai qd meme changée et je l'ai codée comme tu l'as mise pour etre sur.

    enfin j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Overrides Sub Dispose()
            Try
                ReleaseComObject(objPAD)
            Catch e As Exception
                Log.Tracer(e.Message)
            End Try
            Try
                ReleaseComObject(oPAD)
            Catch e As Exception
                Log.Tracer(e.Message)
            End Try
        End Sub
    pour la classe mere et la classe fille et aucune exception n'est levée...

    mais j'ai toujours mon pb de connexion.


    En fait si je fais un bilan de mon problème :



    Mon client (1) se connecte au serveur IIS (2) pour affichier les pages.
    Donc mon appli (2.1) utilise des fonction de ma librairie (2.2) qui fait des connexions vers le serveur SQL Server (3).

    lorsque je regarde le nombre de processus dans l'enterprise manager de sql server, je note un nombre exponentiel de connexion au fur et a mesur.

    J'en conclue donc qu'elles ne sont pas détruites.

    Je m'interesse donc au pool de connexion. Mais sachant que les connexions sont faites par la DLL (sur laquelle bien entendu je n'ai pas la main et qu'il m'est impossible de modifier mais qui ferme bien toutes ses connexion apres utilisation), je n'ai pas la main sur le pool de connexion du framework...

    alors la la fonction Marshall.ReleaseComObject qui est appelée a chaque fin d'utilisation de l'instance de l'objet MaDLL devrait détruire celui ci et par la meme les connexions qui ont été faites. Mais il n'en est rien....

    A noter que ce phénomène ne se produit qu'avec une appli web ASPx, avec un simple exe VB.NET et les memes fonctions, je n'ai pas ce problème.

    Donc le pb doit bien etre gérable a partir de mon appli (2.1) .......
    et pourquoi ReleaseComObject ne détruit pas les connexion ?......
    j'avoue que la je n'ai plus d'idée

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Sinclair
    Donc le pb doit bien etre gérable a partir de mon appli (2.1) .......
    Pas forcément. Si ça vient de la DLL (auquel cas j'ai pas trop d'idée sur le pourquoi ça ne le fait pas pour les applis win, à moins que ce soit lié au mode single-threaded ou mutli-threaded), t'as pas forcément moyen d'y faire grand chose.

    Citation Envoyé par Sinclair
    et pourquoi ReleaseComObject ne détruit pas les connexion ?......
    ReleaseComObject détruit l'objet COM. L' objet COM gère les connexions, donc après ça dépend de lui. S'il les laisse trainer, elles trainent.

    Essaye d'ajouter 'aspcompat=true' dans la directive <%@ Page %> des pages qui utilisent ce composant. Pour l'appel d'objets COM en ASP.NET ça peut aider (du moins pour les composants qui ont besoin de tourner en mode single-threaded, vu qu'ASP.NET est multi-threaded par défaut).

    Sinon je sèche aussi :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  16. #16
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    Joli dessin
    Est ce que tu as pu regarder pour le chaine de connexion ? (cf mon post d'avant)
    Si tu kill aspnet_wp, est ce que ça libère les connexions ?

  17. #17
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Maniak
    Citation Envoyé par Sinclair
    Donc le pb doit bien etre gérable a partir de mon appli (2.1) .......
    Pas forcément. Si ça vient de la DLL (auquel cas j'ai pas trop d'idée sur le pourquoi ça ne le fait pas pour les applis win, à moins que ce soit lié au mode single-threaded ou mutli-threaded), t'as pas forcément moyen d'y faire grand chose.

    Citation Envoyé par Sinclair
    et pourquoi ReleaseComObject ne détruit pas les connexion ?......
    ReleaseComObject détruit l'objet COM. L' objet COM gère les connexions, donc après ça dépend de lui. S'il les laisse trainer, elles trainent.

    Essaye d'ajouter 'aspcompat=true' dans la directive <%@ Page %> des pages qui utilisent ce composant. Pour l'appel d'objets COM en ASP.NET ça peut aider (du moins pour les composants qui ont besoin de tourner en mode single-threaded, vu qu'ASP.NET est multi-threaded par défaut).

    Sinon je sèche aussi
    Bon voila, lundi matin je m'y remet ..... maintenant j'ai bien peur que ca soit la dll qui laisse trainer la connexion.
    De plus, certain sites qui utilisent cette dll ont le meme probleme (mais a moindre degré car ils ne l'utilisent pas bcp)

    Pourtant, j'ai regardé le code de la DLL et quand il y a des connexion, elle sont bien Close() ou Dispose() a la fin ...


    sinon 'aspcompat=true' etait deja présent....

  18. #18
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Pete
    Joli dessin
    Est ce que tu as pu regarder pour le chaine de connexion ? (cf mon post d'avant)
    Si tu kill aspnet_wp, est ce que ça libère les connexions ?
    ben oui c'est une idée que j'essaye d'explorer, mais le problème, c'est que la chaine de connexion ne se défini pas dans mon appli VB.NET mais dans la DLL.

    Je créé un objet du type ma dll, et a cet objet je lui passe les propriétés de connexion. Genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Obj as MaDLL
    Obj.login="monlogin"
    Obj.pass="monpass"
    Obj.retournerinfos()
    je lui renseigne juste mes identifiants et c'est lui qui gere les connexions lorsque j'utilise une de ses fonctions qui nécéssite un appel a la base de donnée.

  19. #19
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    bref, t'es marron

  20. #20
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Pete
    bref, t'es marron
    c'est mon boss qui va etre content

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. à propos la gestion d'une pool de connexion
    Par edogawa dans le forum Général Java
    Réponses: 4
    Dernier message: 28/08/2009, 03h25
  2. pool de connexion .net C# Oracle
    Par zaltalux dans le forum Accès aux données
    Réponses: 3
    Dernier message: 09/10/2008, 13h28
  3. Gestion d'un pool de connexions par C. Jollivet
    Par Baratribord dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/05/2008, 15h34
  4. Réponses: 4
    Dernier message: 28/09/2006, 01h12
  5. Gestion de pool de connexion
    Par vikrem dans le forum JSF
    Réponses: 2
    Dernier message: 20/09/2006, 14h15

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