web-dev-qa-db-ja.com

Java Hibernate / C3P0エラー:「接続メタデータを取得できませんでした。クライアントによる接続のチェックアウトの試行がタイムアウトしました。」

渡されて実行されたコードを取得しようとしています。 Hibernateフレームワークを使用しているようです。構成を微調整するエラーのほとんどを乗り越えましたが、これは私を困惑させます。

Gameappとgamelogの2つのデータベースに接続しようとしています。両方が存在します。 gamelogへの接続に問題があるようですが、gameappへの接続はありません(後でinitで、他のDBに接続してロードします)。以下に、エラーと例外のスタックダンプを貼り付けました。

構成に何か他のものがあることをイメージしているので、そのデータベースの構成ファイルも含めました。私はこれが非常に曖昧であることを知っています、しかし私は何人かのプロが私が逃している愚かな間違いを見ることができることを望んでいます。

<?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>

例外とスタックトレース:

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 com.mchange.v2.resourcepool.BasicResourcePool@ca470 -- 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
13
Allan

C3P0の「checkoutTimeout」プロパティを0以外に設定した場合、タイムアウトが早すぎる可能性があります(これが私の問題でした。解決策:500から2000ミリ秒にバンプしました)。

または、この警告の回避策があります。

をセットする hibernate.temp.use_jdbc_metadata_defaultsプロパティをfalseに。

これは http://www.docjar.com/html/api/org/hibernate/cfg/SettingsFactory.Java.html で見つかりましたが、HibernateがJDBCメタデータのデフォルトを抽出しないことによる副作用がある可能性があります。

8
Tyler Szabo

実際、それは認証エラーでもありません。 MySQLは実行されているか、ローカルホストにバインドされていますか?

telnet 127.0.0.1 3306は機能しますか?もしそうなら、ボックスにmysqlクライアントをインストールして試してください

mysql --user = root --ip = 127.0.0.1そして何が起こるかを見てください

1
MJB

Rootユーザーとパスワードなし(!)でコマンドラインでgamelogmysqlデータベースに接続できるかどうかを確認します。ちなみに、rootのパスワードを設定し、別のアカウントを使用してアプリケーションからデータベースに接続することをお勧めしますが、それは別の話です。

0
Pascal Thivent