2010-04-30 3 views
12

J'essaie d'obtenir du code qui m'a été transmis. Il semble utiliser le framework Hibernate. J'ai passé la plupart des erreurs à peaufiner la configuration, mais celle-ci me rend perplexe.Erreur Java Hibernate/C3P0: "Impossible d'obtenir les métadonnées de connexion. Une tentative par un client d'extraire une connexion a expiré."

Il essaie de se connecter à deux bases de données: gameapp et gamelog. Les deux existent. Il semble y avoir des problèmes de connexion au gamelog, mais aucun ne se connecte à gameapp (plus tard dans l'init, il se connecte et charge bien d'autres DBs). Ci-dessous, j'ai collé l'erreur et le vidage de pile d'exception. J'ai l'imagerie il ya quelque chose d'autre dans les configs, donc j'ai également inclus le fichier de configuration pour ce DB. Je sais que c'est très vague, mais j'espère que certains professionnels verront la stupide erreur qui me manque.

<?xml version="1.0" encoding="GBK"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://127.0.0.1:3306/gamelog</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password"></property> 
     <property name="connection.useUnicode">true</property>  
      <property name="connection.characterEncoding">UTF-8</property> 
     <property name="hibernate.jdbc.batch_size">100</property> 
     <property name="jdbc.fetch_size">1</property> 
     <property name="hbm2ddl.auto">none</property><!-- update --> 
     <property name="connection.useUnicode">true</property> 
     <property name="show_sql">true</property> 
     <!-- c3p0-configuration --> 
     <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
     <property name="hibernate.c3p0.min_size">5</property> 
     <property name="hibernate.c3p0.max_size">10</property> 
     <property name="hibernate.c3p0.timeout">30</property> 
     <property name="hibernate.c3p0.idle_test_period">30</property> 
     <property name="hibernate.c3p0.max_statements">0</property> 
     <property name="hibernate.c3p0.acquire_increment">5</property>  
    </session-factory> 
</hibernate-configuration> 

Exception et la pile trace:

2010-04-30 17:50:00,411 WARN [org.hibernate.cfg.SettingsFactory] - Could not obtain connection metadata 
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) 
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:35) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:76) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1933) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1216) 
    at com.database.hibernate.util.HibernateFactory.<init>(Unknown Source) 
    at com.database.hibernate.util.HibernateUtil.<clinit>(Unknown Source) 
    at com.server.databaseop.goodOp.GoodOpImpl.initBreedGoods(Unknown Source) 
    at com.server.databaseop.goodOp.GoodOpImpl.access$000(Unknown Source) 
    at com.server.databaseop.goodOp.GoodOpImpl$1.run(Unknown Source) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:165) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:636) 
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from [email protected] -- timeout at awaitAvailable() 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
    ... 18 more 
+0

La chaîne de connexion dans le fichier de configuration fonctionne-t-elle pour les connexions à la base de données sur la même machine sur laquelle le code s'exécute? –

+0

mysql -u root gamelog fonctionne exactement comme prévu. – Allan

+0

J'ai été en mesure de parler aux développeurs de code et ils m'ont dit que cette erreur est très bien pour leur installation et juste l'ignorer. Je dois aimer les harengs rouges. – Allan

Répondre

8

Si vous avez défini la propriété "checkoutTimeout" de C3P0 à quelque chose autre que 0 vous pourriez arriver trop rapidement (c'était mon problème, la solution: le faire passer à 2000 millisecondes à partir de 500).

Sinon, il y a une solution de contournement pour cet avertissement:

Définissez la propriété hibernate.temp.use_jdbc_metadata_defaults à false.

Trouvé cela dans http://www.docjar.com/html/api/org/hibernate/cfg/SettingsFactory.java.html, bien qu'il puisse y avoir des effets secondaires de ne pas avoir les valeurs par défaut des métadonnées JDBC d'extraction Hibernate.

+0

Cela m'a été utile, nous avions juste déménagé dans un nouvel environnement et je recevais les mêmes erreurs, mais l'application fonctionnait. Merci! – samspot

+0

des effets secondaires peuvent inclure si vous utilisez quelque chose comme SchemaUpdate. – Njax3SmmM2x2a0Zf7Hpd

0

Vérifiez si vous pouvez vous connecter à la base de données mysql gamelog sur la ligne de commande avec l'utilisateur root et aucun mot de passe (!). En guise de remarque, je vous recommande de définir un mot de passe pour root et d'utiliser un autre compte pour vous connecter à la base de données à partir de votre application, mais c'est une autre histoire.

1

En fait, ce n'est même pas une erreur d'authentification. MySQL fonctionne-t-il ou est-il lié à localhost?

est-ce que telnet 127.0.0.1 3306 fonctionne? le cas échéant, installez le client MySQL sur la boîte et essayez

mysql --user = root = 127.0.0.1 --ip et de voir ce qui se passe

+0

Que faire si telnet localhost 3306 ne fonctionne pas? – Guilherme

+0

Eh bien, si telnet sur votre IPS, y compris localhost ne fonctionne pas et que vous n'avez pas changé le port par défaut, soit mysql aint en cours d'exécution ou vous parvenez à un problème de pare-feu – MJB

+0

vous pouvez également faire mysql -u root -h 127.0.0.1, seulement mentionner parce que «-u» est généralement plus commun, moins d'écriture, et plus propre :) – Seaux

Questions connexes