Мы запускаем 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 секунд) и посмотрел на отслеживания стека, которые обнаруживаются в нашем приложении. Отслеживания стека из всевозможных методов в нашем приложении. Это не похоже существует один метод, на который мы можем указать и сказать, что это пропускает соединения.
Любая справка, отлаживающая эту проблему, больше всего ценилась бы.
Я сомневаюсь, что Hibernate или Spring утекают соединения, я подозреваю, что где-то возникла проблема с конфигурацией, из-за которой ваше приложение запускает наши соединения.Вот что я бы сделал:
Уменьшите количество одновременных пользователей и размер пула, я не уверен, что проблема связана с нагрузкой.
Установите unreturnedConnectionTimeout
на значение больше 0
в сочетании с debugUnreturnedConnectionStackTraces
на true
, чтобы выяснить, где проверяются соединения. out и не возвращен в пул, и опубликовать часть сгенерированной трассировки стека.
Определите один бизнес-поток (один сценарий использования), в котором возникает проблема, и запускайте тест для этого сценария только до тех пор, пока не обнаружите проблему.
Кроме того, я бы добавил в вопрос одну или две трассировки стека, возможно, кто-то заметит что-то очевидное.
Hibernate и Spring - это не те соединения, которые пропускают соединения, утечка где-то в вашем приложении. Я не уверен насчет C3P0, но BoneCP ( http://jolbox.com ) поддерживает обнаружение незакрытых соединений (и дает вам стековые трассировки того, где вы их открыли) + закроет любые протекающие соединения для вы, когда поток умирает без надлежащей очистки.