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

Accès aux données Discussion :

La connexion à ma base de données n'est jamais fermée et je ne sais pas pourquoi


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut La connexion à ma base de données n'est jamais fermée et je ne sais pas pourquoi
    Bonjour,

    Je viens de me rendre compte d'une chose surprenante, je n'arrive pas à fermer la connexion à ma base de données.
    Techno: WPF
    Base : PostgreSQL
    Provider: NPGSQL

    Voici un bout de code:
    Code c# : 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
     
    public partial class MainWindow : Window
    {
    	public MainWindow()
    	{
    		InitializeComponent();
     
     
    		var connection = new NpgsqlConnection(ConnectionStringGet("..........."); //Step 0
    		connection.Open(); //Step 1
     
    		Thread.Sleep(3000);
     
    		connection.Close();
    		connection.Dispose();
    		connection = null;
    		//step2
    	}
    }

    Je regarde les connexions ouvertes grâce à PgAdminIII
    Step 0 : 0 connexion d'ouverte.
    Step 1 : 1 connexion d'ouverte.
    Step 2 : 1 connexion d'ouverte.

    Par contre si je ferme l'application, la connexion à la base de données est coupée.
    Je pense que c'est mieux d'ouvrir et fermer la connexion à chaque fois non?
    Comment se fait il que ça ne marche pas dans mon code?
    Merci d'avance

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Le code que tu donnes c'est celui que tu testes pour donner l'état 0/1/2 ?
    Tu fais du pooling de connexions ?
    Et si tu mets ça dans un TransactionScope ça fait pareil ?
    Comment testes-tu que la connexion est ouverte ?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    A priori je dirais que c'est dû au pooling, et que c'est donc normal...

    Essaie d'ajouter ça après avoir fermé la connection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NpgsqlConnection.ClearAllPools();
    ou bien ça avant de la fermer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NpgsqlConnection.ClearPool(connection);

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    @Er3wanLe code que tu donnes c'est celui que tu testes pour donner l'état 0/1/2 ?
    Oui
    Tu fais du pooling de connexions ?
    Pour être très honnête, je ne sais pas ce que c'est.
    Et si tu mets ça dans un TransactionScope ça fait pareil ?
    TransactionScope, c'est l'utilisation du Using?
    Comment testes-tu que la connexion est ouverte ?
    PgAdminIII > Outils > Etat du serveur

    @towlev
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    NpgsqlConnection.ClearAllPools();
    ça fonctionne parfaitement avec ça.

    D'après vos réponses, deux questions:
    1) Faut il ou y a 'til une utilité à utiliser le pooling de connexion?
    2) Je viens du monde PHP/MySQL, sur un client lourd faut il ouvir et fermer la connexion à la base de données à chaque requête?

    Encore merci à vous deux

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    D'après vos réponses, deux questions:
    1) Faut il ou y a 'til une utilité à utiliser le pooling de connexion?
    Oui! Ouvrir une connexion est couteux en temps et en ressources.
    Citation Envoyé par takinelinfo Voir le message
    2) Je viens du monde PHP/MySQL, sur un client lourd faut il ouvir et fermer la connexion à la base de données à chaque requête?
    Tu peux le faire à chaque transaction si le pooling est activé sinon ca risque d'être trop couteux.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    @Nathanael

    Code c# : 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
     
    var connection = new NpgsqlConnection(ConnectionStringGet(new DatabaseSetting("152.18.80.215", "postgres", "a1b2c3d4", "geco_faa_faam", "5432", "UTF8", "35")));
     
    Console.WriteLine("Query 1");
    connection.Open();
    var command = new NpgsqlCommand("SELECT * FROM usertest", connection);
    command.ExecuteNonQuery();
    connection.Close();
    Thread.Sleep(3000);
     
    Console.WriteLine("Query 2");
    connection.Open();
    var command2 = new NpgsqlCommand("SELECT * FROM usertest", connection);
    command.ExecuteNonQuery();
    connection.Close();
     
    Thread.Sleep(3000);
    connection.ClearPool();

    En effet, lorsque je fais ça il ne ferme pas la connexion à la base de données entre les deux requêtes.
    Si le pooling est activé, y a t'il une différence entre:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    connection.Open();
    //Requête
    connection.Close();
     
    connection.Open();
    //Requête2
    connection.Close();

    et
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    connection.Open();
    //Requête
    //Requête2
    connection.Close();

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il y a une différence du point de vue de .NET, dans le sens où l'objet NpgsqlConnection sera dans l'état ouvert, puis fermé ; mais la connexion native sous-jacente restera dans l'état ouvert si le pooling est activé, et sera réutilisée la prochaine fois que tu ouvrira la connexion avec NpgsqlConnection

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Je pense pas. Peut etre que le connection.Close() rollback la transaction courante si elle a pas été commitée auquel cas ca ferait une différence.

  9. #9
    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
    Points : 6 334
    Points
    6 334
    Par défaut
    Si le pooling est activé, Open réserve une connexion du pool, Close la libère. Le pool se débrouille pour faire ce qu'il veut avec ses connexions sous-jacentes.

    Donc pour résumer, si le pooling est activé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C1.Open
    C2.Open
    C1.Close
    C2.Close
    Ceci récupère deux connexions différentes du pool.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C1.Open
    C1.Close
    C2.Open
    C2.Close
    Ceci peut potentiellement réutiliser la même connexion mais rien ne permet de prédire ce comportement à l'avance.
    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

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    Et du coup avec le pooling est ce que l'utilisation du pattern singleton pour l'accès au données ne perd pas un peu de son intérêt puisque même si l'on a une seule instance, plusieurs connexions peuvent être ouvertes à un instant T?

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    Et du coup avec le pooling est ce que l'utilisation du pattern singleton pour l'accès au données ne perd pas un peu de son intérêt puisque même si l'on a une seule instance, plusieurs connexions peuvent être ouvertes à un instant T?
    Bah en fait tu peux pas réouvrir une connexion fermée il me semble, il faut créer une nouvelle instance... donc le pattern singleton va pas beaucoup t'aider ici

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    Et du coup avec le pooling est ce que l'utilisation du pattern singleton pour l'accès au données ne perd pas un peu de son intérêt puisque même si l'on a une seule instance, plusieurs connexions peuvent être ouvertes à un instant T?
    Le pattern singleton est de toute facon une mauvaise idée pour l'accès aux données...

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 60
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Le pattern singleton est de toute facon une mauvaise idée pour l'accès aux données...
    Simple question.... pourquoi ?

  14. #14
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Car un singleton ca se partage et qu'il n'est pas de bonnes pratique de partager les accès aux données. Chaque unité logique doit avoir la sienne. Typiquement en ASP.Net c'est un accès par requête utilisateur, en client lourd un par par requête.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    en client lourd un par par requête.
    Ca fait beaucoup quand même... j'aurais plutôt dit "un par lot de requêtes"
    (ouais je chipote ^^)

  16. #16
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Oui alors non j'ai zappé un bout de ma phrase en fait!
    Pour un service WCF c'est un par requête, pour un client lourd un par écran (sauf si c'est un écran un peu complexe avec de l'asynchrone et/ou du multi-thread).

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 60
    Points : 100
    Points
    100
    Par défaut
    Merci de ta réponse

Discussions similaires

  1. [MySQL] Ce code de connexion à la base de données est-il valable ?
    Par Le nettoyeur dans le forum PHP & Base de données
    Réponses: 24
    Dernier message: 25/02/2014, 15h01
  2. Réponses: 1
    Dernier message: 15/05/2008, 18h45
  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