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.
Spróbuj profilera, w przeciwnym razie jesteś tylko zgadywać, dlaczego jest tak powolny. – Robin
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. –
Tak, to pachnie jak problemy z siecią – demaniak