Утечка соединения Hibernate/c3p0

Мы запускаем 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 секунд) и посмотрел на отслеживания стека, которые обнаруживаются в нашем приложении. Отслеживания стека из всевозможных методов в нашем приложении. Это не похоже существует один метод, на который мы можем указать и сказать, что это пропускает соединения.

Любая справка, отлаживающая эту проблему, больше всего ценилась бы.

10
задан Khandelwal 11 May 2010 в 17:47
поделиться

2 ответа

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

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

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

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

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

12
ответ дан 3 December 2019 в 23:12
поделиться

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

2
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: