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

JDBC Java Discussion :

Plantage postgresql Cannot create PoolableConnectionFactory


Sujet :

JDBC Java

  1. #1
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut Plantage postgresql Cannot create PoolableConnectionFactory
    Bonjour, j'ai plusieurs sites JSF, j'utilise postgresql avec des datasource, ça marche quelque-temps puis j'ai fatalement cette sqlException :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur SQL.
    Cannot create PoolableConnectionFactory (FATAL: les emplacements de connexions restants sont réservés pour les connexions superutilisateur non relatif à la réplication)
    voici le type de datasource que j'utilise en context.xml sur un Apache Tomcat/8.0.14
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Resource auth="Container" driverClassName="org.postgresql.Driver" logAbandoned="true" maxIdle="100" maxTotal="200" maxWaitMillis="10"
                  name="jdbc/myBDD" password="XXXXXXXX" removeAbandonedOnBorrow="true" removeAbandonedTimeout="20" type="javax.sql.DataSource"
                  url="jdbc:postgresql://127.0.0.1:5432/xxxxxxxxxxxx" username="xxxxxxxxxxxxxxx"/>
    en ce qui concerne cette datasource je l'ai surtout conçu d'après des exemples trouvés sur internet je n'arrive pas à saisir la signification de tous les attributs, même sur la doc en Anglais j'ai du mal à comprendre.

    Pour mes connexion j'utilise un singleton je ne close pas la connexion car je veux réutiliser l'instance Connection à chaque fois :
    Database.java :
    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
    import java.sql.Connection;
    import java.sql.SQLException;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
     
    /**
     *
     * @author pj
     */
    public class Database {
     
        private static Database instance;
        private static DataSource ds;
        private static Connection conn;
     
        private Database() throws NamingException, SQLException {
            InitialContext cxt = new InitialContext();
            ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/myBDD");
            conn = ds.getConnection();
        }
     
        public static Database getInstance() throws NamingException, SQLException {
            if (instance == null) {
                instance = new Database();
            }
            return instance;
        }
     
        public Connection getConn() {
            return conn;
        }
    }
    instance que j'utilise comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [...]
        private void upgradeRel() throws NamingException, SQLException {
            String query = "insert into localisation_site (id_localisation, id_site) values (?,?)";
            try (PreparedStatement prepare = Database.getInstance().getConn().prepareStatement(query)) {
                prepare.setLong(1, localisation.id);
                prepare.setLong(2, id);
                prepare.executeUpdate();
            }
        }
    [...]
    Merci ! :-)

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Très mauvaise idée d'avoir une connexion SQL dans une variable statique, récupères une connexion à chaque fois que tu en as besoin et surtout n'oublie pas de la clôturer.
    Le message d'erreur indique que toutes les connexions sont utilisées et postgreSQL indique qu'il réserve les connexions restantes pour ses besoins.

  3. #3
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    ok merci, donc j'ouvre une connexion avant d'en avoir besoin et une fois la requête finie je la ferme ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Oui, il faut récupérer une connexion à chaque fois qu tu en as besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Database {
          public Connection getConn() {
            return ds.getConnection();
        }
    }
    Et à l'usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            try (Connection cnx = Database.getInstance().getConn()) {
                PreparedStatement prepare = cnx.prepareStatement(query)
                prepare.setLong(1, localisation.id);
                prepare.setLong(2, id);
                prepare.executeUpdate();
            }

Discussions similaires

  1. [PostgreSQL] Cannot create PoolableConnectionFactory
    Par stc074 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 02/04/2015, 17h00
  2. Réponses: 0
    Dernier message: 21/04/2011, 12h03
  3. Java Tomcat SQL Server "Cannot create PoolableConnectionFactory"
    Par Bobble dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 30/11/2009, 19h32
  4. Réponses: 0
    Dernier message: 29/04/2009, 21h17
  5. Réponses: 2
    Dernier message: 09/04/2008, 20h45

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