Hibernate démarrage très lent
Pour une raison quelconque, le démarrage de mon application hibernate est unbarrably lent. (jusqu'à 2 min)
J'ai été de penser que la c3p0 configuration est simplement faux (une question relative à la) mais l'étude des journaux de montre, qu'il n'y a pas d'activité juste après la connexion au serveur est établie. Aussi, en utilisant le haut-dans les bureaux de fonctionnalités d'Hibernate montre le même résultat.
Ici est un extrait de l'journaux:
20:06:51,248 DEBUG BasicResourcePool:422 - decremented pending_acquires: 0
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
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 com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:08:14,883 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
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
(Veuillez garder à l'esprit le commentaire##.)
J'ai aussi essayé une ancienne Postgres Pilote JDBC avec pas de chance que ce soit.
De la connexion à une Base de données locale fonctionne très bien. La connexion est établie immédiatement et je peux interroger la base de données. Cette distance db est un Heroku dev instance. Je l'ai essayé avec une autre télécommande. Même résultat.
Je suis à court d'idées de ce que je peux vérifier maintenant de se débarrasser de cette gêne. Toute aide serait grandement appréciée.
Peut-être mon hibernate.cfg.xml est 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: j'ai essayé de trouver la raison de ce retard par les journaux et le profilage, mais ont été largement échoué. (Je ne suis pas aussi avancé dans ce domaine.) En fin de compte je l'ai fait aller avec essayer et échouer et a changé ma db MySQL distant exemple pour vérifier si une différence apparaît. Il s'avère, que la connexion est établie presque immédiatement.
Juste une intuition, mais vous pourriez vouloir vérifier votre réseau, DNS peut-être? Essayez d'utiliser l'IP de votre serveur à la place du nom du serveur. Ça sonne un peu comme il est en attente sur un délai d'attente.
Ouais, ça sent comme les problèmes de réseau
OriginalL'auteur bentrm | 2013-01-21
Vous devez vous connecter pour publier un commentaire.
Voir Hibernate Lente à Acquérir Postgres Connexion
hibernate.temp.use_jdbc_metadata_defaults=false
Pour éviter les méta-données recharger pendant SessionFactory création.
Je suggère celui-ci pour être accepté comme réponse comme il a travaillé pour moi dans une situation similaire.
Cela réduit mon temps de démarrage de 40 secondes à 14. Les heures seront sauvés.
Dans hibernate.cfg.xml:
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
OriginalL'auteur Darryl Miles
Pour Postgres, ajouter dans l'application config:
Première ligne est nécessaire si pas de déterminer le Dialecte
Résultats
Avant:
~4 minutes
Après:
~1 minute
OriginalL'auteur Ricardo Spinoza
Si elle est anormalement lent, puis vous avez probablement un lock dans votre application, ou à certaines ressources blocs. En tout cas, téléchargez VisualVM (JDK comprend jconsole, abrutir version de celui-ci) et de vérifier ce que votre fils font, où ils sont bloqués (threaddump) et si cela ne donne pas toutes les réponses rapides, allumez le générateur de profils.
OriginalL'auteur Mirko Adari
Ce récipient que vous utilisez? c3p0 doit être installé dans le conteneur, e.g Tomcat. Si vous exécutez des tests unitaires, pour chrissakes, ne pas utiliser un pool de connexion. Si vous le mettez dans tomcat, vous devez le faire avec une Ressource tag et ensuite vous connecter à l'aide de JNDI. La meilleure façon de le faire.
OriginalL'auteur Rob