2013-01-21 20 views
15

Per qualche motivo, l'avvio della mia applicazione di ibernazione è lentamente lento. (fino a 2 minuti) Ho pensato che la configurazione di c3p0 fosse errata (related question) ma lo studio dei log mostra che non c'è attività subito dopo aver stabilito la connessione al server. Inoltre, l'utilizzo delle funzionalità di polling incorporate di Hibernate mostra lo stesso risultato.Hibernate startup molto lento

Ecco un frammento dai registri:

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 

(Si prega di mente il commento # #.)

Ho provato anche un vecchio driver JDBC Postgres senza fortuna di sorta.

La connessione a un database locale funziona correttamente. La connessione viene stabilita immediatamente e posso interrogare il database. Questo db remoto è un'istanza di Heroku dev. L'ho provato anche con un altro telecomando. Stesso risultato

Sono fuori di idee quello che posso controllare ora per sbarazzarsi di questo fastidio. Qualsiasi aiuto sarebbe molto apprezzato.

Forse il mio hibernate.cfg.xml è utile:

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: ho cercato di trovare la ragione della ritardare tramite i log e la profilatura, ma non ci sono riusciti con successo. (Non sono così avanzato in quest'area però.) Alla fine sono andato con try e fail e ho cambiato il mio db per un'istanza MySQL remota per verificare se si verifica qualche differenza. Risulta, che la connessione è stabilita quasi immediatamente.

+0

Prova una profiler, altrimenti si è solo indovinare il motivo per cui è così lento. – Robin

+0

Solo un sospetto, ma potresti voler controllare la tua rete, forse il DNS? Prova a utilizzare l'IP del tuo server invece del nome del server. Sembra un po 'come se fosse in attesa di un timeout. –

+0

Sì, questo odora di problemi di rete – demaniak

risposta

26

Vedi Hibernate Slow to Acquire Postgres Connection

hibernate.temp.use_jdbc_metadata_defaults=false

Per evitare di ricarica dei meta-dati durante la creazione SessionFactory.

+0

Questa sembra davvero la risposta. Sfortunatamente, non posso controllarlo ora. Mi chiedo se è ok per SO se segnalo come risposta comunque per indirizzare le persone verso questa direzione. C'è ancora molta attenzione a questo problema. – bentrm

+0

Suggerisco di accettare questa risposta come ha funzionato per me in una situazione simile. – Oswaldo

+0

Questo riduce il tempo di avvio da 40 secondi a 14. Le ore verranno salvate. – Will

1

Se è anormalmente lento, probabilmente è presente un blocco nell'applicazione o alcuni blocchi di risorse. In ogni caso, scarica VisualVM (JDK include jconsole, versione ridotta di esso) e controlla cosa stanno facendo i tuoi thread, dove sono bloccati (threaddump) e se questo non fornisce risposte rapide, attiva il profiler.

1

Che contenitore stai usando? c3p0 deve essere installato nel contenitore, ad esempio Tomcat. Se si stanno eseguendo test unitari, per i crismi, non utilizzare un pool di connessioni. Se lo metti in tomcat, lo fai con un tag Resource e poi ti connetti usando JNDI. Il modo migliore per farlo.

0

Per Postgres, aggiungere in config applicazione:

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

Prima linea è necessaria se non determinare Dialetto

Risultati

Prima:

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 minuti

Dopo:

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 minuto