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

NHibernate Discussion :

NHibernate et connection Pooling


Sujet :

NHibernate

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut NHibernate et connection Pooling
    Bonjour,

    Ma question est d'odre générale car je n'arrive pas à bien comprendre ce que je trouve sur le sujet et j'ai besoin d'aide.

    J'utilise NHibernate pour me mapper à une base de données PostGre.

    Voici la configuration dans mon service Web

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
        <session-factory>
          <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
          <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>
          <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
          <property name="connection.connection_string_name">ApiAdmin.Connexion</property>
          <property name="show_sql">true</property>
          <property name="current_session_context_class">web</property>
          <mapping assembly="MyDataAccess" />
        </session-factory>
      </hibernate-configuration>
    J'aimerais savoir si cette connection utilise du pooling par default et si oui qu'elles sont les valeurs et comment les modifier et jouer avec.

    Si elle n'utilise pas est-ce que je peux en mettre en place et comment le configurer?

    Cordialement,
    Christophe.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 721
    Points : 24 844
    Points
    24 844
    Par défaut
    http://www.anujvarma.com/max-pool-si...ng-in-ado-net/
    si réellement tu fais de l'intensif, passer au dessus de 100 peut etre utile, mais ca reste rare ... est-ce que tu Dispose bien tes connections ?

    les bases de données ont généralement aussi un pool, à vérifier sur postgre ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    http://www.anujvarma.com/max-pool-si...ng-in-ado-net/
    si réellement tu fais de l'intensif, passer au dessus de 100 peut etre utile, mais ca reste rare ... est-ce que tu Dispose bien tes connections ?

    les bases de données ont généralement aussi un pool, à vérifier sur postgre ...
    Qu'entendez vous par bien disposer mes connections?


    Pour présenter mon contexte d'utilisation, les accès à ma base se font dans le cadre d'un traitement de requête WCS/WFS.

    Pour une requête classique il y a en moyenne 5/6 requêtes vers ma base SQL (authentification, validation, log...)

    Pour chaque requête on procéde de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    using (ISession session = NHibernateSessionProvider.GetSession())
                    {
                        // retrieve count and results in the same transaction
                        using (ITransaction transaction = session.BeginTransaction())
                        {
                            ...
     
                            // End transaction
                            transaction.Commit();
                        }
                    }
    Est-ce que cela vous semble être la bonne façon de faire?

    Les services que nous exposons sont soumis à un grand nombre de requêtes mais je n'arrive pas à me rendre compte si la valeur 100 est dépassée ou non.

    Postgre semble aussi avoir un pool effet (https://pierreau.fr/pro/Share/Livre_...PostgreSQL.pdf) qui se configure avec pgpool ou pgbouncer.

    Est-ce qu'il faut paramétrer ces pools de connexion à la fois dans NHibernate et dans postgre?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 721
    Points : 24 844
    Points
    24 844
    Par défaut
    le bloc using appelle la méthode dispose (donc libère la connection ou la garde dans le pool) ca c'est bon

    je ne suis ni expert nhibernate ni postgre
    après sur sql server on peut voir à un instant T combien il y a de connexions ouvertes et utilisées, il te faudrait trouver quelque chose de similaire pour voir si la taille du pool est adapté
    après j'aurais tendance à dire que modifier le pool côté application suffit, de toute façon quand le pool sgbdr est dépassé il peut quand même créer des connexions et le pool app prend le relais sur le pooling

    après si tu n'as pas de problèmes d'ouvertures de connexion longues, se poser la question n'est pas forcément une priorité
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le bloc using appelle la méthode dispose (donc libère la connection ou la garde dans le pool) ca c'est bon

    je ne suis ni expert nhibernate ni postgre
    après sur sql server on peut voir à un instant T combien il y a de connexions ouvertes et utilisées, il te faudrait trouver quelque chose de similaire pour voir si la taille du pool est adapté
    après j'aurais tendance à dire que modifier le pool côté application suffit, de toute façon quand le pool sgbdr est dépassé il peut quand même créer des connexions et le pool app prend le relais sur le pooling

    après si tu n'as pas de problèmes d'ouvertures de connexion longues, se poser la question n'est pas forcément une priorité
    Merci pour vos précisions. Je vais essayer de quantifier ces connecxions à l'instant T.

    En me renseignant sur les connections NHibernate je me suis également interrogé sur le fait d'utiliser plutot openSession() ou getCurrentSession().
    Il semblerait que la principale différence soit l'utilisation de openSession() dans un environnement Multi Thread alors que getCurrentSession() sera plus performant dans un environnement Single Thread.

    Afin d'être sûr de ne pas me mélanger les pinceaux qu'est ce qui caractérise un environnement Multi-Thread? est-ce le fait que mon web services est interrogeable par N requêtes en même temps ou alors est-ce que cela vient du traitement d'une requête, si il est fait dans un seul Thread où si à l'intérieur de ce Thread j'ai parrallélisé des tâches et donc que le traitement d'une requête va utiliser plusieurs Trhaeds... J'espère que ma question est claire.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 721
    Points : 24 844
    Points
    24 844
    Par défaut
    sur un client lourd l'appli démarre sur un thread et il est possible d'en démarrer d'autres
    chaque thread exécute un bout de code de ton appli

    en web par défaut ca doit être multi thread, sinon ca voudrait dire que seule une personne peut faire une requête http à la fois
    et là ton point d'entrée est sur un thread, et tu peut en démarrer d'autres pour paralléliser certaines tâches

    getCurrentSession doit servir à utiliser la même connection, donc seulement si on a qu'un seul thread, sinon si un thread veut exécuter une requete alors qu'un autre utilise déjà la connexion pour rapatrier des données ca va planter
    => il te faut bien une nouvelle connection à chaque fois

    après ce que fait le sgbdr derrière n'a rien à voir, sur certaines requêtes il va paralléliser lui aussi sur d'autres non
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    sur un client lourd l'appli démarre sur un thread et il est possible d'en démarrer d'autres
    chaque thread exécute un bout de code de ton appli

    en web par défaut ca doit être multi thread, sinon ca voudrait dire que seule une personne peut faire une requête http à la fois
    et là ton point d'entrée est sur un thread, et tu peut en démarrer d'autres pour paralléliser certaines tâches

    getCurrentSession doit servir à utiliser la même connection, donc seulement si on a qu'un seul thread, sinon si un thread veut exécuter une requete alors qu'un autre utilise déjà la connexion pour rapatrier des données ca va planter
    => il te faut bien une nouvelle connection à chaque fois

    après ce que fait le sgbdr derrière n'a rien à voir, sur certaines requêtes il va paralléliser lui aussi sur d'autres non
    Très bien et merci pour votre temps.

    Bonne journée!

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

Discussions similaires

  1. Cannot get a connection, pool exhausted
    Par questionneuse dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 09/08/2007, 08h31
  2. Réponses: 3
    Dernier message: 11/08/2006, 16h00
  3. Configurer tomcat pour connection pool sybase
    Par Invité dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 22/03/2006, 21h02
  4. [JDBC][SQL Server]Connection Pooling
    Par WE dans le forum JDBC
    Réponses: 4
    Dernier message: 14/03/2006, 10h15
  5. [connection pool]commons DBCP
    Par horalass dans le forum JDBC
    Réponses: 2
    Dernier message: 20/12/2005, 12h02

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