Vous n'êtes pas identifié(e).

#1 07/02/2011 22:02:01

jpiotrowski
Membre

GlassFish v2.11 - DataSource - JNDI

Bonjour,

l'exemple http://jdbc.postgresql.org/documentatio … bc-ds-jndi me semble inadéquat. JNDI est surtout fait pour justement ne avoir à renseigner les attributs d'une DataSource dans le code source d'une classe :

Jdbc3PoolingDataSource source = new Jdbc3PoolingDataSource();

source.setDataSourceName("A Data Source");
source.setServerName("localhost");
source.setDatabaseName("test");
source.setUser("testuser");
source.setPassword("testpassword");
source.setMaxConnections(10);
new InitialContext().rebind("DataSource", source);

J'aurai plutôt vu ceci :

        Context ctx = null;
        try {
            ctx = new InitialContext();
            source = (Jdbc3PoolingDataSource) (DataSource) ctx.lookup("java:comp/env/jdbc/postgresql"); /* forçage proposé par NetBeans */
            connection = source.getConnection();
        } catch (NamingException ne) {
            throw new Exception(ne.getMessage());
        }

Alors, comment utiliser un pool de connexion via JNDI, enregistré dans GlassFish v2.11 ?

Hors ligne

#2 07/02/2011 22:21:30

flo
Membre

Re : GlassFish v2.11 - DataSource - JNDI

À mon avis, l'exemple que vous citez est surtout destiné aux développeurs de pool d'application... ou pour comprendre comment cela fonctionne ( je m'en sers en formation, parce qu'on forme des débutants à Java, et que c'est un peu hard de leur montrer JNDI d'emblée...)

Je ne connais pas Glassfish, et je ne sais pas par coeur comment on utilise JNDI (surtout à cette heure-ci...), par contre ce qui est sûr c'est que c'est (ou ça devrait être ) dans la doc du serveur d'application (ou dans les tutoriels de Sun/Oracle), mais pas dans les docs Postgresql (là on est vraiment sur une problèmatique JEE, pas spécifique Postgresql). Si mes souvenirs sont exacts, la seule chose spécifique au moteur de base de données, c'est la forme de l'URL à renseigner.
Pour PostgreSQL, L'URL a une de ces formes :
jdbc:postgresql:database
jdbc:postgresql://host/database
jdbc:postgresql://host:port/database

C'est décrit ici :
http://jdbc.postgresql.org/documentatio … nnect.html (pour la 8.3, mais ça m'étonnerait que cela ait changé)

Bonne recherche. N'hésitez pas à revenir si vous avez d'autres soucis spécifiques à Postgresql.

Dernière modification par flo (07/02/2011 22:22:17)

Hors ligne

#3 08/02/2011 00:54:31

jpiotrowski
Membre

Re : GlassFish v2.11 - DataSource - JNDI

Bon, j'arrive enfin à quelque chose : la connection marche enfin...

        org.postgresql.ds.PGSimpleDataSource source2 = new org.postgresql.ds.PGSimpleDataSource();
        Context context = null;
        try {
            context = new InitialContext();

        } catch (NamingException ne) {
            throw new Exception(ne.getMessage());
        }
        source2 = (PGSimpleDataSource)  context.lookup("java:comp/env/jdbc/postgresql");
        connection = source2.getConnection();
        System.out.println("JNDI OK");

Et aussi n'oublions pas web.xml :

    <resource-ref>
        <res-ref-name>jdbc/postgresql</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>

Le pool de connexions :

Nom : PostgresPool
Nom de classe de la source de données : org.postgresql.jdbc3.Jdbc3ConnectionPool
Type de ressource : javax;sql.ConnectionPoolDataSource
Tout le reste par défaut.
Propriétés:
databaseName : ****
portNumber : 5432
DataSourceName : jdbc/postgresql
serverName : localhost
password : *****
user : ****

La Ressources JDBC :

Nom JNDI : jdbc/postgresql
Nom du Pool :  PostgresPool
Statut : activé

Je verrai plus tard pour les pools de connection (rappel : org.postgresql.ds.PGSimpleDataSource)
(PS : c'est dans le cadre d'une application Web).

Bon, je vais dormir, une dure et palpitante journée m'attend demain sad

Hors ligne

#4 10/02/2011 20:01:16

jpiotrowski
Membre

Re : GlassFish v2.11 - DataSource - JNDI

Et bie ça ne marche plus le lendemain : il manquait des choses.

Voici ce qui marche (Java) :
            Context initCtx = new InitialContext();
            System.out.println("InitialContext OK");
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            System.out.println("initCtx.lookup OK");
            DataSource ds = (DataSource) envCtx.lookup("jdbc/postgresql");
            System.out.println("envCtx.lookup OK");
            Connection conn = ds.getConnection();
            System.out.println("getConnection OK");
            conn.close();
            System.out.println("close OK");
Je vous passe le détail entre getConnection() et close().

MAIS il fallait modifier le pool de connexion ainsi :

Nom : PostgresPool
Nom de classe de la source de données : org.postgresql.ds.PGPoolingDataSource
Type de ressource : java.sql.DataSource

Tout le reste par défaut.

Propriétés:

databaseName : ****
portNumber : 5432
DataSourceName : jdbc/postgresql
serverName : localhost
password : *****
user : ****
JDBC30DataSource: true

Et surtout dans sun-web.xml (j'utilise NetBeans 6.8) :

  <resource-ref>
    <res-ref-name>jdbc/postgresql</res-ref-name>
    <jndi-name>jdbc/postgresql</jndi-name>
    <default-resource-principal>
      <name>****</name>
      <password>****</password>
    </default-resource-principal>
  </resource-ref>

Vous remarquerez la distinction possible entre le nom JNDI et sa référence. Pour JDBC, on a la même chose, mais pour d'autres ressources, Glassfish admet une distinction possible.

Donc, définir correctement un pool de connexions et une ressource JDNI dans le serveur JEE n'est pas suffisant : il faut déclarer pas mal de choses
dans les fichiers de configuration de l'application web...

Dernière modification par jpiotrowski (10/02/2011 20:01:44)

Hors ligne

Pied de page des forums