Запуск спящего режима очень медленный

По какой-то причине запуск моего приложения спящего режима является небывало медленным. (до 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, чтобы проверить, нет ли какой-либо разницы. Оказывается, соединение устанавливается почти сразу.

Ответы

Ответ 2

Если он ненормально медленный, вы, вероятно, имеете блокировку в своем приложении или некоторые блоки ресурсов. В любом случае загрузите VisualVM (JDK включает в себя jconsole, тупиковую версию) и проверьте, что делают ваши потоки, где они застревают (threaddump), и если это не дает быстрых ответов, включите профилировщик.

Ответ 3

Какой контейнер вы используете? c3p0 следует установить в контейнер, например Tomcat. Если вы используете модульные тесты, для chrissakes не используйте пул соединений. Если вы поместите его в tomcat, вы выполните это с тегом Resource, а затем подключитесь к нему с помощью JNDI. Лучший способ сделать это.

Ответ 4

Для 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 минута