2012-04-09 6 views
44

이 문제를 디버깅하는 데 정말 어려움을 겪고 있습니다. 포스트 그레스와 연결을 시도 할 때마다 1 분 정도 걸립니다. 연결이 설정되면 모든 것이 정상입니다. 모든 매핑을 비활성화하고 아무 것도로드하지 않으려 고 시도했지만 여전히 연결에는 시간이 오래 걸립니다. 또한 유효성 검사를 비활성화 해 보았습니다. 간단한 JDBC 연결을 사용하면 즉각적입니다. 최대 절전 모드는 상당한 시간이 소요되는 무언가를하고 있습니다. 어떤 입력이라도 대단히 감사합니다!최대 절전 모드 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 

: 9,753,210

다음은 로그 결과입니다. 내 수업 경로에 모든 소스가 없지만 변수를 볼 수 있습니다. Hibernate가 pg_catalog.pg_type 테이블을 쿼리, 즉 일분 대기 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 드라이버를 로딩하는 것이 중요합니다. 그것은 SQL 칼럼과 운영을 위해 필요하지 않은 다른 다양한 구조들 옆의 주석을 포함하여 ALL META DATA를로드하고 있습니다. 이것은 기본적으로 이유를 모르겠어요하지만 당신은 확실히 당신이 명시 적으로 필요한 경우가 아니라면이 기능을 사용하거나 사용 중지해야합니다

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

인스턴트 연결을 지금! 나는이에서 찾을 수

유일한 정보는 코드입니다 :

나는 또한 다른 신원 세대 전략은 예외를 던지고 hibernate.jdbc.use_get_generated_keys 수 있도록했다
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

내 경험으로는 정말 작동하는 hibernate dialect를 명시 적으로 정의해야한다. 그렇지 않으면 적어도 PostgreSQL 9.3 및 Hibernate 4의 경우 응용 프로그램 시작시 오류가 발생합니다. – chalda

+0

SchemaUpdate가 비활성화 되어도 영향을받을 수 있습니다. – Njax3SmmM2x2a0Zf7Hpd

0

이 막연하게 우리가 루비 온 레일즈에서 본 문제처럼 들린다. 당신은 내가 여기에 설명 된 것과 유사한 원인을 찾을 수 있습니다

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

즉, 그 문제는 여러 클래스 로더 컨텍스트에서 JDBC 드라이버를 명시 적으로 등록에 의해 발생했다.

4

. 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

1

하나의 postgresql 서버에는 여러 개의 데이터베이스가 포함될 수 있습니다. Unfortunatelly 당신은 hide other-database metadatas to one connection, 그 이유는 메타 데이터 - 독서가 jdbc 드라이버에 의해 오랜 시간이 걸리는 thats 수 없습니다!

theese 데이터베이스를 다른 postgres-server에 분리하면 메타 데이터 읽기 성능이 향상됩니다!

how to seperate on centos을 읽으십시오.

관련 문제