2012-04-09 15 views
44

この問題をデバッグするのは本当に困難です。私がポストグルとの接続を確立しようとすると、それは1分かかります。接続が確立された後は、すべて正常です。私はすべてのマッピングを無効にしようとしましたが、何もロードしていませんでしたが、依然として接続には時間がかかります。私はまた、バリデーションを無効にしようとしましたが、違いはありません。シンプルなJDBC接続を使用すると、瞬間的です。 Hibernateはかなりの時間がかかる何かをやっているので、それを絞り込むことはできません。どんな入力も大歓迎です!HibernateがゆっくりとPostgresの接続を取得する

Postgresはドライバ:

postgresql-9.1-901.jdbc4.jar 

構成設定:コード内

<hibernate-configuration> 
    <session-factory> 
    <!-- properties --> 
     <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="connection.driver_class">org.postgresql.Driver</property> 

     <property name="connection.url">jdbc:postgresql://xxxx.com:5432/xxxxx</property> 
     <property name="connection.username">xxxxxxx</property> 
     <property name="connection.password">xxxxxxx</property> 

    </session-factory> 
</hibernate-configuration> 

その他の設定:

config.setProperty("hibernate.hbm2ddl.auto", hbm2ddlMode); 
    //config.setProperty("hibernate.cache.use_query_cache", "true"); 
    config.setProperty("hibernate.cache.use_second_level_cache", "true"); 
    //config.setProperty("hibernate.cache.region.factory_class", "net.sf.ehcache.hibernate.EhCacheRegionFactory"); 
    config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider"); 
    //config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider"); 
    config.setProperty("hibernate.jdbc.fetch_size", "100"); 
    config.setProperty("hibernate.jdbc.batch_size", "30"); 
    config.setProperty("hibernate.jdbc.use_scrollable_resultset", "true"); 
    config.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider"); 

    config.setProperty("hibernate.c3p0.acquire_increment", "1"); 
    config.setProperty("hibernate.c3p0.idle_test_period", "0"); 
    config.setProperty("hibernate.c3p0.min_size", "1"); 
    config.setProperty("hibernate.c3p0.max_size", "2"); 
    config.setProperty("hibernate.c3p0.timeout", "0"); 
    config.setProperty("javax.persistence.validation.mode", "none"); 

ここで遅延が発生するコードのセグメントです:

私は、デバッガをステップ実行、これについてもう少し研究を行ってきた

[main] 2012-04-09 10:40:32,823 110391 INFO C3P0ConnectionProvider - HHH000046: 
Connection properties: {user=hgaidb_test, password=****} 
[main] 2012-04-09 10:40:32,823 110391 INFO C3P0ConnectionProvider - HHH000006: 
Autocommit mode: false 
[main] 2012-04-09 10:40:34,100 111668 DEBUG JdbcServicesImpl - Database -> 
     name : PostgreSQL 
    version : 8.3.3 
     major : 8 
     minor : 3 
[main] 2012-04-09 10:40:34,101 111669 DEBUG JdbcServicesImpl - Driver -> 
     name : PostgreSQL Native Driver 
    version : PostgreSQL 9.1 JDBC4 (build 901) 
     major : 9 
     minor : 1 
******************************************************************************* 
// 1 MINUTE DELAY 
******************************************************************************* 
[main] 2012-04-09 10:40:34,102 111670 DEBUG JdbcServicesImpl - JDBC version : 4. 
0 
[main] 2012-04-09 10:41:21,632 159200 INFO Dialect - HHH000400: Using dialect: 
org.hibernate.dialect.PostgreSQLDialect 
******************************************************************************* 
[main] 2012-04-09 10:41:21,669 159237 INFO LobCreatorBuilder - HHH000424: Disab 
ling contextual LOB creation as createClob() method threw error : java.lang.refl 
ect.InvocationTargetException 
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic flush du 
ring beforeCompletion(): disabled 
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic session 
close at end of transaction: disabled 
[main] 2012-04-09 10:41:21,815 159383 DEBUG SettingsFactory - JDBC batch size: 3 
0 
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - JDBC batch updates 
for versioned data: disabled 
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - Scrollable result 
sets: enabled 
[main] 2012-04-09 10:41:21,817 159385 DEBUG SettingsFactory - Wrap result sets: 
disabled 
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC3 getGenerated 
Keys(): enabled 
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC result set fe 
tch size: 100 
[main] 2012-04-09 10:41:21,819 159387 DEBUG SettingsFactory - Connection release 
mode: auto 
[main] 2012-04-09 10:41:21,819 159387 INFO TransactionFactoryInitiator - HHH000 
399: Using default transaction strategy (direct JDBC transactions) 
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Default batch fetc 
h size: 1 
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Generate SQL with 
comments: disabled 
[main] 2012-04-09 10:41:21,845 159413 DEBUG SettingsFactory - Order SQL updates 
by primary key: disabled 
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Order SQL inserts 
for batching: disabled 
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Query translator: 
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory 
[main] 2012-04-09 10:41:21,867 159435 INFO ASTQueryTranslatorFactory - HHH00039 
7: Using ASTQueryTranslatorFactory 
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - Query language sub 
stitutions: {} 
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - JPA-QL strict comp 
liance: disabled 
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Second-level cache 
: enabled 
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Query cache: disab 
led 
[main] 2012-04-09 10:41:21,869 159437 DEBUG SettingsFactory - Cache region facto 
ry : org.hibernate.cache.internal.NoCachingRegionFactory 
[main] 2012-04-09 10:41:21,872 159440 DEBUG SettingsFactory - org.hibernate.cach 
e.internal.NoCachingRegionFactory did not provide constructor accepting java.uti 
l.Properties; attempting no-arg constructor. 
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Optimize cache for 
minimal puts: disabled 
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Structured second- 
level cache entries: disabled 
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Statistics: disabl 
ed 
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Deleted entity syn 
thetic identifier rollback: disabled 
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Default entity-mod 
e: pojo 
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Named query checki 
ng : enabled 
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Check Nullability 
in Core (should be disabled when Bean Validation is on): enabled 
[main] 2012-04-09 10:41:21,876 159444 DEBUG SettingsFactory - multi-tenancy stra 
tegy : NONE 

は、ここでログの結果です。私はクラスパスのすべてのソースを持っていないが、私はまだ変数を見ることができます。 Hibernateはpg_catalog.pg_typeテーブルを照会している、その1分待ちDurring:ここ

[SELECT typname FROM pg_catalog.pg_type WHERE oid = , ] 

はスクリーンショットです:

DebugWindow

+0

このような遅延はDNSの問題によって引き起こされる可能性があります。それを排除するために 'connection.url'にドメイン名の代わりにIPアドレスを使用しようとします。 – axtavt

+0

IPで試しましたが、取得時間に違いはありません。 –

+0

参照:http://stackoverflow.com/questions/23969399/persistence-createentitymanagerfactory-takes-very-long-time-to-return – Dojo

答えて

91

私はそれを固定しました=)私は本当にこの答えを見つけるために周りを逸していなければなりませんでした。基本的には、メタデータとJDBCドライバの読み込みになります。これは、すべてのMETA DATAをロードしています。これには、SQLカラムやその他のさまざまな構文のほかに、操作に必要のないコメントも含まれます。これはデフォルトでオンになっている理由を私は知らないが、あなたは間違いなくあなたが明示的にそれを必要としない限り、オフ、この機能を有効にする必要があります

config.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false"); 

インスタント接続を今すぐ!

私はこの上で見つけることができる唯一の情報は、コードである:

107  // 'hibernate.temp.use_jdbc_metadata_defaults' is a temporary magic value. 
108  // The need for it is intended to be alleviated with future development, thus it is 
109  // not defined as an Environment constant... 
110  // 
111  // it is used to control whether we should consult the JDBC metadata to determine 
112  // certain Settings default values; it is useful to *not* do this when the database 
113  // may not be available (mainly in tools usage). 
114  boolean useJdbcMetadata = ConfigurationHelper.getBoolean("hibernate.temp.use_jdbc_metadata_defaults", configValues, true); 

http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/4.1.1.Final/org/hibernate/engine/jdbc/internal/JdbcServicesImpl.java#JdbcServicesImpl

+2

うわー!これも私のためにそれを修正! – trusktr

+0

これは本当に働いている休止状態の方言のための私の経験から、明示的に定義されなければなりません。それ以外は、少なくともPostgreSQL 9.3とHibernate 4ではアプリケーションの起動時に失敗を引き起こします。 – chalda

+0

SchemaUpdateは、無効にすることで影響を受ける場合があります。私が ' false'をhibernate.cfg.xmlに追加するまで、 – Njax3SmmM2x2a0Zf7Hpd

0

これは漠然と私たちはRuby on Railsをで見た問題のように聞こえます。あなたは、私がここで説明したものに類似した原因を調べかもしれません:

http://archives.postgresql.org/pgsql-performance/2009-11/msg00128.php

要するに、その問題は、複数のクラスローダのコンテキストからJDBCドライバを明示的に登録することにより引き起こされました。

4

私もそうアイデンティティ生成戦略が例外を投げていたhibernate.jdbc.use_get_generated_keysを有効にする必要がありました。 DBから受け取ったメタデータに基づいて自動的に有効にされる前。ですから私の全解決策は、以下の2つの行を持続性に追加することでした。XML:

<property name="hibernate.jdbc.use_get_generated_keys" value="true" /> 
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> 
+0

ありがとうございました! Hibernate 5.2、Spring Framework 4.3およびPostgreSQL JDBC 4.2で動作しました – Chu

1

つのPostgreSQLサーバは複数のデータベースを含めることができます。 Unfortunatellyあなたはhide other-database metadatas to one connectionできません、その理由は、メタデータの読み込みは、jdbcドライバによって長い時間がかかる!

異なるpostgres-serversにデータベースを分離し、メタデータの読み込みパフォーマンスが向上します!

how to seperate on centosを読んでください。

関連する問題