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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    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 Expert 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
    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 ?

  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 : 44
    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
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    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();

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