2012-04-09 84 views
44

我很難調試此問題。每當我嘗試與postgres建立連接時,都需要一整分鐘。連接建立後,一切都很好。我試過禁用所有映射並且不加載任何內容,但是連接仍然需要很長時間才能獲得。我也嘗試禁用驗證,沒有區別。當我使用簡單的JDBC連接時,它是即時的。 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"); 

在此處,發生的延遲的代碼段:

private SessionFactory buildSessionFactory() throws Exception { 
     ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); 

      //Building session takes a whole minute without mappings!!! 
     sessionFactory = config.buildSessionFactory(serviceRegistry); 

     validateConnection(); 

     return sessionFactory; 
    } 

這裏的日誌結果:

[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 

我已經做了這一點更多的研究,通過調試步進。我的類路徑中沒有所有的源代碼,但我仍然可以看到這些變量。 Durring一個分鐘的等待中,Hibernate查詢pg_catalog.pg_type表:

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

以下是截圖:

DebugWindow

+0

這樣的延遲可能是由DNS問題引起的,請嘗試在'connection.url'中使用IP地址而不是域名來排除。 – axtavt 2012-04-09 15:22:13

+0

我試過IP,在採集時間上仍然沒有差別。 – 2012-04-09 15:29:53

+0

另請參閱:http://stackoverflow.com/questions/23969399/persistence-createentitymanagerfactory-takes-very-long-time-to-return – Dojo 2016-03-25 05:47:31

回答

91

我修正了它=)我真的不得不尋找到這個答案。基本上,它歸結爲加載元數據和JDBC驅動程序。它正在加載所有元數據,包括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 2014-04-15 08:20:25

+0

從我對這個真正工作的hibernate方言的經驗來看,必須明確地定義。否則它會導致應用程序啓動失敗(至少在PostgreSQL 9.3和Hibernate 4中)。 – chalda 2014-06-24 09:01:37

+0

SchemaUpdate可能會因禁用而受到影響。 – Njax3SmmM2x2a0Zf7Hpd 2014-07-17 05:14:03

4

我只好也使hibernate.jdbc.use_get_generated_keys在以其他方式識別身份生成策略拋出異常。在基於從DB接收的元數據自動啓用之前。所以我的整個解決方案是添加以下兩行來持久化。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 2017-07-06 01:25:16