web-dev-qa-db-ja.com

休止状態の起動が非常に遅い

何らかの理由で、Hibernateアプリケーションの起動が非常に遅いです。 (最大2分)c3p0の構成が明らかに間違っていると思っていましたが( 関連する質問 )、ログを調べると、サーバーへの接続が確立された直後はアクティビティがないことがわかりました。また、Hibernateの組み込みのポーリング機能を使用しても同じ結果が得られます。

ログの抜粋は次のとおりです。

20:06:51,248 DEBUG BasicResourcePool:422 - decremented pending_acquires: 0
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:06:51,273 DEBUG JdbcServicesImpl:121 - Database ->
       name : PostgreSQL
    version : 9.1.6
      major : 9
      minor : 1
20:06:51,274 DEBUG JdbcServicesImpl:127 - Driver ->
       name : PostgreSQL Native Driver
    version : PostgreSQL 9.2 JDBC4 (build 1002)
      major : 9
      minor : 2
20:06:51,274 DEBUG JdbcServicesImpl:133 - JDBC version : 4.0 ##### HANGS FOR 2 MINUTES  ON THIS LINE #####
20:08:14,727  INFO Dialect:123 - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
20:08:14,736  INFO LobCreatorBuilder:120 - HHH000424: Disabling contextual LOB creation as createClob() method threw error : Java.lang.reflect.InvocationTargetException
20:08:14,736 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0
20:08:14,736 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0
20:08:14,883 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:08:14,883 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:08:14,883 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0

(#コメント#に注意してください。)

また、古いPostgresJDBCドライバーを試しましたが運がまったくありませんでした。

ローカルデータベースへの接続は問題なく機能します。接続がすぐに確立され、データベースにクエリを実行できます。このリモートデータベースはHeroku開発インスタンスです。別のリモコンでも試してみました。同じ結果。

この煩わしさを取り除くために今何をチェックできるか、私には考えがありません。どんな助けでも大歓迎です。

たぶん私のhibernate.cfg.xmlは役に立ちます:

http://www.hibernate.org/dtd/hibernate-

configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url"/>
        <property name="connection.default_schema"/>
        <property name="connection.username"/>
        <property name="connection.password"/> 

        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
            <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
        <property name="current_session_context_class">thread</property>            
        <property name="hibernate.c3p0.acquire_increment">3</property>
        <property name="hibernate.c3p0.min_size">3</property>
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquireRetryDelay">500</property>

        <property name="show_sql">true</property>
        <property name="format_sql">false</property>

        <property name="hbm2ddl.auto">validate</property>

        <mapping class="core.entities.Exam" />
        <mapping class="core.entities.Examination" />
        ...
    </session-factory>
</hibernate-configuration>

編集:ログとプロファイリングを介して遅延の理由を見つけようとしましたが、それで広く失敗しました。 (しかし、私はこの分野ではそれほど進んでいません。)結局、私は試して失敗し、リモートMySQLインスタンスのデータベースを変更して違いが発生するかどうかを確認しました。接続はほぼ即座に確立されることが判明しました。

20
bentrm

Postgres接続を取得するために休止状態が遅い を参照してください

hibernate.temp.use_jdbc_metadata_defaults=false

SessionFactoryの作成中にメタデータの再読み込みを回避するため。

35
Darryl Miles

Postgresの場合、アプリケーション構成を追加します。

spring.jpa.database-platform = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

方言を決定しない場合は最初の行が必要です

結果

前:

09:10:19.637 [main] INFO  o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
09:14:17.159 [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect

〜4分

後:

09:40:10.930 [main] INFO  o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
09:40:11.043 [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect

〜1分

6
Ricardo Spinoza

起動が遅いのは、次の設定が原因である可能性があります。

<property name="hbm2ddl.auto">update</property>

この構成は、休止状態の開始時に、エンティティがddlと一致するかどうかを確認し、「create」、「update」などのアクションを実行することを意味します。これには時間がかかりすぎます。

したがって、解決策はこの構成にコメントすることです。その後、Hibernateは検証なしで開始します。

3
kidfruit

異常に遅い場合は、アプリケーションまたはいくつかのリソースブロックがロックされている可能性があります。いずれにせよ、VisualVM(JDKにはjconsoleが含まれており、そのバージョンがダム化されています)をダウンロードし、スレッドが実行していること、スレッドがスタックしている場所(threaddump)を確認し、それでもすぐに答えが得られない場合は、プロファイラーをオンにします。

1
Mirko Adari

どのコンテナを使用していますか? c3p0は、Tomcatなどのコンテナにインストールする必要があります。単体テストを実行している場合、chrissakesの場合は、接続プールを使用しないでください。 Tomcatに入れる場合は、Resourceタグを使用してそれを行い、JNDIを使用して接続します。それを行うための最良の方法。

0
Rob