2013-01-21 19 views
15

Z jakiegoś powodu uruchamianie mojej aplikacji hibernacji jest wyjątkowo powolne. (do 2 min) Myślałem, że konfiguracja c3p0 jest zupełnie błędna (related question), ale badanie dzienników pokazuje, że nie ma żadnej aktywności zaraz po nawiązaniu połączenia z serwerem. Ponadto, korzystając z wbudowanych funkcji odpytywania w Hibernate, pokazuje ten sam wynik.Uruchamianie hibernacji bardzo powolne

Oto fragment z dzienników:

20:06:51,248 DEBUG BasicResourcePool:422 - decremented pending_acquires: 0 
20:06:51,248 DEBUG BasicResourcePool:1644 - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
20:06:51,248 DEBUG BasicResourcePool:1644 - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
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 [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
20:08:14,883 DEBUG BasicResourcePool:1644 - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
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 

(proszę przeszkadza # Komentarz #).

Próbowałem też starszego sterownika PostgreSQL JDBC bez powodzenia w ogóle.

Połączenie z lokalną bazą danych działa dobrze. Połączenie jest ustanawiane natychmiast i mogę wysłać zapytanie do bazy danych. Ten zdalny db jest instancją dewelopera Heroku. Próbowałem go również z innym pilotem. Ten sam wynik.

Nie mam pomysłów, co mogę teraz sprawdzić, aby pozbyć się tej irytacji. Każda pomoc byłaby bardzo cenna.

Może mój hibernate.cfg.xml jest pomocne:

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> 

EDIT: Próbowałem znaleźć powód dla opóźnienia za pośrednictwem logów i profilowania, ale nie przyniosły one większego rezultatu. (Nie jestem jednak zaawansowany w tej dziedzinie). W końcu poszedłem z próbą i nie udało mi się zmienić bazy danych na zdalną instancję MySQL, aby sprawdzić, czy występują jakiekolwiek różnice. Okazuje się, że połączenie nawiązane jest niemal natychmiast.

+0

Spróbuj profilera, w przeciwnym razie jesteś tylko zgadywać, dlaczego jest tak powolny. – Robin

+0

Wystarczy przeczucie, ale może warto sprawdzić sieć, może DNS? Spróbuj użyć adresu IP serwera zamiast nazwy serwera. Brzmi trochę tak, jakby czekał na timeout. –

+0

Tak, to pachnie jak problemy z siecią – demaniak

Odpowiedz

26

Zobacz Hibernate Slow to Acquire Postgres Connection

hibernate.temp.use_jdbc_metadata_defaults=false

Aby uniknąć przeładowania meta-danych podczas tworzenia SessionFactory.

+0

To naprawdę wygląda na odpowiedź. Niestety, nie mogę tego teraz sprawdzić. Zastanawiam się, czy jest to w porządku dla SO, jeśli zaznaczę to jako odpowiedź, aby wskazać ludzi w tym kierunku. Ciągle zwraca się uwagę na ten problem. – bentrm

+0

Proponuję, aby ten był akceptowany jako odpowiedź, ponieważ zadziałało dla mnie w podobnej sytuacji. – Oswaldo

+0

Powoduje to skrócenie czasu uruchamiania z 40 sekund do 14. Godziny zostaną zapisane. – Will

1

Jeśli jest wyjątkowo wolny, prawdopodobnie masz blokadę w swojej aplikacji lub niektóre bloki zasobów. W każdym razie pobierz VisualVM (JDK zawiera jconsole, zubożoną wersję tego) i sprawdź, co robią twoje wątki, gdzie utknęły (threaddump) i jeśli to nie daje szybkich odpowiedzi, włącz profilera.

1

Jakiego pojemnika używasz? c3p0 powinno zostać zainstalowane w kontenerze, np. Tomcat. Jeśli korzystasz z testów jednostkowych, na przykład, nie używaj puli połączeń. Jeśli umieścisz go w tomcat, robisz to za pomocą znacznika zasobów, a następnie łącz się z nim za pomocą JNDI. Najlepszy sposób na zrobienie tego.

0

Dla PostgreSQL, dodać w konfiguracji aplikacji:

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

Pierwsza linia jest konieczne, jeśli nie określić dialekt

Wyniki

Przed:

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 minut

Po:

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 minuta

Powiązane problemy