Hibernate / c3p0 утечка соединения - PullRequest
10 голосов
/ 11 мая 2010

Мы запускаем приложение spring / hibernate / c3p0 под нагрузкой. Когда я уменьшаю значение c3p0 maxPoolSize до уровня, намного меньшего, чем число одновременно работающих пользователей, наше приложение просто зависает. В журнале нет сообщений об ошибках, но он также не переходит вперед.

Я ожидаю, что приложение замедлится, но не остановится совсем.

Вот наша конфигурация c3p0:

<bean id="coreDataSource" 
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="${core.jdbc.driver}"
          p:jdbcUrl="${core.jdbc.url}"
          p:user="${core.jdbc.user}"
          p:acquireIncrement="5"        
          p:acquireRetryAttempts="10"
          p:acquireRetryDelay="5000"
          p:initialPoolSize="52"
          p:maxIdleTime="3600"
          p:maxIdleTimeExcessConnections="300"
          p:minPoolSize="52"
          p:maxPoolSize="125"
          p:numHelperThreads="6"
          p:unreturnedConnectionTimeout="0">
          <property name="password">
              <bean class="com.docfinity.util.encryption.SpringStringDecrypter"
                  p:decryptFlag="${core.jdbc.decryptPasswordFlag}"
                  p:encryptedString="${core.jdbc.password}" />
          </property>
    </bean>

Это заблокируется, если я добавлю 160 пользователей.

Я попытался установить unreturnedConnectionTimeout в положительное значение (120 секунд) и посмотрел на следы стека, которые отображаются в нашем приложении. Трассировки стека взяты из различных методов нашего приложения. Не похоже, что есть один метод, на который мы можем указать и сказать, что это утечка соединений.

Любая помощь в устранении этой проблемы была бы очень признательна.

Ответы [ 4 ]

12 голосов
/ 12 мая 2010

Я сомневаюсь, что Hibernate или Spring имеют утечку соединений, я подозреваю, что где-то возникает проблема конфигурации, из-за которой ваше приложение запускает наши соединения. Вот что я бы сделал:

  • Уменьшите количество одновременных пользователей и размер пула, я не уверен, что проблема связана с нагрузкой.

  • Установите unreturnedConnectionTimeout на значение больше 0 в сочетании с debugUnreturnedConnectionStackTraces на true, чтобы выяснить, где проверяются соединения. и не возвращаются в пул и публикуют часть сгенерированной трассировки стека.

  • Определите один бизнес-поток (один сценарий использования), в котором возникает проблема, и запускайте тест по этому сценарию только до тех пор, пока не обнаружите проблему.

Кроме того, я бы обновил вопрос одной или двумя трассировками стека, возможно, кто-то заметит что-то очевидное.

2 голосов
/ 23 июня 2010

Hibernate и Spring - не те, кто пропускает соединения, где-то в вашем приложении просачивается. Я не уверен насчет C3P0, но BoneCP (http://jolbox.com) поддерживает обнаружение незакрытых соединений (и дает вам возможность проследить, где вы их открыли) + закроет для вас все утечки соединений, когда поток отключится очистки.

0 голосов
/ 26 мая 2017

Запрос к вашей базе данных:

select * from pg_stat_activity;

И проверьте, какие запросы имеют длительный статус idle in transaction. Попробуйте найти их в своем коде и выяснить, почему транзакция не завершена.


Несколько вещей для проверки в коде / конфигурации:

  • Зафиксируйте транзакции явно или используйте @Transactional. Обратите внимание, что @Transactional работает только для открытых методов.

  • Если вы используете Hibernate 5.1.0.Final, файл persistence.xml должен содержать:

<property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider" />

Вместо:

<property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />

  • Если вы используете

<property name="hibernate.enable_lazy_load_no_trans" value="true" />

это может привести к утечке соединения при отложенной загрузке. Связанные обсуждения:


Проверьте связанные статьи:

0 голосов
/ 14 марта 2012

В этом посте описывается как отладить проблему утечки соединения c3p0 с использованием параметров и трассировки стека. Надеюсь, это поможет

...