Bonjour à tous,
Après 2 jours complets de galère, je me tourne vers vous.
Je vous explique le contexte :
Je dois changer le mode de déclaration de la connexion à la base de données en passant d'une déclaration dans un hibernate.properties, qui est dans l'application, vers une déclaration de type JNDI de Tomcat v.6 afin de pouvoir configurer facilement la connexion pour chaque serveur.
Je vous explique le paramétrage que j'ai effectué :
1. J'ai déclaré dans $TOMCAT_HOME/conf/context.xml mon datasource à l'intérieur de la balise <context> :
2. J'ai modifié mon fichier hibernate.cfg.xml dans le projet DAO:
Code : Sélectionner tout - Visualiser dans une fenêtre à part <Resource name="jdbc/testDS" auth="Container" type="javax.sql.DataSource" username="postgres" password="postgres" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/test"/>
3. J'ai modifié mon code pour accéder au profil JNDI dans le projet DAO:
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 <session-factory> <property name="connection.datasource">java:comp/env/jdbc/testDS</property> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.default_schema">test</property> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> <!-- <property name="connection.driver_class">org.postgresql.Driver</property> --> <!-- <property name="hibernate.session_factory_name">java:hibernate/HibernateUtilGeneric</property> --> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="c3p0.idleConnectionTestPeriod">300</property> <!-- configuration pool via c3p0--> <property name="c3p0.acquire_increment">1</property> <property name="c3p0.idle_test_period">100</property> <!-- seconds --> <property name="c3p0.max_size">100</property> <property name="c3p0.max_statements">12</property> <property name="c3p0.min_size">10</property> <property name="c3p0.timeout">100</property> <!-- seconds --> <mapping ....../> </session-factory>
4. Au cas où, j'ai changer mon web.xml dans mon appli web :
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 public class HibernateUtilGeneric { static Logger log = Logger.getLogger(HibernateUtilGeneric.class); public static final SessionFactory sessionFactory; static { try { Properties prop =new Properties(); log.debug("Enumerate properties...."); Properties p = System.getProperties(); for (Object obj : p.keySet()) { log.debug(obj.toString() + " = " + System.getProperty(obj.toString())); } // InitialContext ic = new InitialContext(); //lorsque ce mode d'init est //actif, j'ai un problème de cast en dbcp (au lieu de C3P0) et hibernate.connection... sessionFactory = new Configuration().configure().buildSessionFactory(); //(SessionFactory) ic.lookup("java:comp/env/jdbc/p2wDS"); if(sessionFactory==null){ log.error("SessionFactory is NOT DEFINED"); }else{ log.info("SessionFactory defined successfully"); } } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed log.error("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } }
Voilà pour la config.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/testDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
Le problème que je rencontre peut être différent en fonction de mes configs. Pour l'instant après pas mal de recherche, la config ci-dessus semble être la moins mauvaise. Cependant, elle est nulle car elle ne fonctionne. Avec cette config j'obtiens le message suivant :
J'ai donc un problème dans la lecture du JNDI de TOMCAT.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 2010-01-15 11:27:40,174 INFO C3P0 using driver: null at URL: null org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:50) 2010-01-15 11:27:40,175 INFO Connection properties: {} org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:51) 2010-01-15 11:27:40,175 INFO autocommit mode: false org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:54) 2010-01-15 11:27:40,175 WARN No JDBC Driver class was specified by property hibernate.connection.driver_class org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:57) 2010-01-15 11:27:40,193 INFO MLog clients using log4j logging. com.mchange.v2.log.MLog.<clinit>(MLog.java:80) 2010-01-15 11:27:40,524 INFO Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10] com.mchange.v2.c3p0.C3P0Registry.banner(C3P0Registry.java:204) 2010-01-15 11:27:40,646 INFO Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@99921a67 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@3b4b8dc6 [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kfsx86dqojf21f8ijxe|3cbb4b, idleConnectionTestPeriod -> 100, initialPoolSize -> 10, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 100, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 12, maxStatementsPerConnection -> 0, minPoolSize -> 10, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@e57aa936 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> z8kfsx86dqojf21f8ijxe|17748d3, jdbcUrl -> null, properties -> {} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> z8kfsx86dqojf21f8ijxe|1be4663, numHelperThreads -> 3 ] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:462) 2010-01-15 11:28:00,644 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@948069 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector.run(ThreadPoolAsynchronousRunner.java:608) 2010-01-15 11:28:00,668 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@948069 -- APPARENT DEADLOCK!!! Complete Status: Managed Threads: 3 Active Threads: 3 Active Tasks:
- Voyez-vous une erreur stupide qui pourrait me régler le problème en 2 secondes ?
- Pensez-vous que la balise <context> dans $TOMCAT_HOME/conf/context.xml doit spécifier obligatoirement les attributs docBase="" et path="" (j'ai déjà essayé cela ne marche pas mieux) ? Dans le cas où ces attributs ne sont pas spécifiés cela s'applique pour toutes les applications de tomcat ? Faut-il placer le fichier dans $TOMCAT_HOME/conf/catalina/$NOMAPPLICATION.xml (déjà essayé aussi) ?
Les docs que j'ai lu :
- How to JNDI Tomcat
- How to datasource Tomcat
- Pourquoi utiliser JNDI et sa config : un bon article
- How to configure C3P0 with Hibernate
- Beaucoup d'autre généralement moins bien....
Je me sens vraiment désarmé face à ce problème qui semble pourtant extrêmement simple. Si vous avez des solutions, n'hésitez surtout pas.
Je vous remercie sincèrement pour vos réponses.
J'espère que la solution sera débile (ce qui risque d'etre le cas selon les lois de murphy).
Merci encore.
Quentin.
Tomcat V.6
JDK 1.6
Eclipse Galileo
Ubuntu 9.10
Partager