Ответ 1
См. Hibernate Slow для получения связи Postgres
hibernate.temp.use_jdbc_metadata_defaults=false
Чтобы избежать перезагрузки метаданных во время создания SessionFactory.
По какой-то причине запуск моего приложения спящего режима является небывало медленным. (до 2 мин) Я думал, что конфигурация c3p0 проста неправильно (связанный вопрос), но изучение журналов показывает, что нет активности сразу после соединения на сервер. Кроме того, использование встроенных возможностей опроса Hibernate показывает тот же результат.
Вот фрагмент из журналов:
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
(Обратите внимание на #comment #.)
Я также попробовал более старый драйвер JDBC Postgres без везения.
Подключение к локальной базе данных работает нормально. Соединение устанавливается немедленно, и я могу запросить базу данных. Этот удаленный db является экземпляром разработчика Heroku. Я попробовал это с другим пультом. Тот же результат.
У меня нет идей, что я могу проверить сейчас, чтобы избавиться от этой досады. Любая помощь будет высоко оценена.
Может быть, полезен мой hibernate.cfg.xml:
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: Я попытался найти причину задержки через журналы и профилирование, но с ним не получилось. (Я не настолько продвинутый в этой области, хотя.) В конце концов я пошел с try и fail и изменил свой db для удаленного экземпляра MySQL, чтобы проверить, нет ли какой-либо разницы. Оказывается, соединение устанавливается почти сразу.
См. Hibernate Slow для получения связи Postgres
hibernate.temp.use_jdbc_metadata_defaults=false
Чтобы избежать перезагрузки метаданных во время создания SessionFactory.
Если он ненормально медленный, вы, вероятно, имеете блокировку в своем приложении или некоторые блоки ресурсов. В любом случае загрузите VisualVM (JDK включает в себя jconsole, тупиковую версию) и проверьте, что делают ваши потоки, где они застревают (threaddump), и если это не дает быстрых ответов, включите профилировщик.
Какой контейнер вы используете? c3p0 следует установить в контейнер, например Tomcat. Если вы используете модульные тесты, для chrissakes не используйте пул соединений. Если вы поместите его в tomcat, вы выполните это с тегом Resource, а затем подключитесь к нему с помощью JNDI. Лучший способ сделать это.
Для Postgres добавьте конфигурацию приложения:
spring.jpa.database-platform = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
Первая строка необходима, если не определена Диалект
Результаты
До:
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 минуты
После:
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 минута