Служба Spring отключается после отключения соединения с БД

У меня есть приложение веб-службы spring cxf, развернутое на сервере JBOSS. Служба работает нормально, и время от времени (в течение 5-6 дней после запуска сервера) я получаю сообщение об ошибке «Не удалось открыть соединение JDBC для транзакции; вложенным исключением является org.apache.commons.dbcp.SQLNestedException: Cannot get соединение, ошибка пула, тайм-аут ожидания объекта бездействия», и эта конкретная служба отключается

У меня есть около 17 служб внутри этого приложения, и только служба, у которой была эта проблема с подключением к БД, отключается, пока я не перезапущу сервер.

Другие сервисы работают.

Ниже приведена конфигурация моего шаблона JDBC.

<bean id="dataSource" destroy-method="close"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="10" />
        <property name="maxIdle" value="10" />
        <property name="maxActive" value="100" />
        <property name="maxWait" value="1000" />
        <property name="validationQuery" value="select 1 from sysibm.sysdummy1" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="timeBetweenEvictionRunsMillis" value="1200000" />
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <property name="numTestsPerEvictionRun" value="5" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

Мы очень ценим вашу помощь.


person Cool    schedule 08.08.2011    source источник


Ответы (3)


Я бы рекомендовал вам переключиться на источник данных JNDI, управляемый JBOSS.

person duffymo    schedule 08.08.2011

Это похоже либо на утечку соединения, либо на то, что у вас есть действительно длительные процессы, которые удерживают соединение с базой данных в течение длительного времени, что в конечном итоге истощает ваш пул соединений. Также возможно, хотя и маловероятно, что у вас очень высокая задержка базы данных, что в пуле появляется мертвое соединение, и что распознавание мертвого соединения, установка нового и его проверка занимают больше времени, чем 1 секунда, которую вы дали бассейн.

person Ryan Stewart    schedule 09.08.2011
comment
Да, это правильно. Я использую базу данных, которая используется рядом приложений. Я работаю над проблемами утечки соединения. Но моя настоящая проблема заключается в том, как я могу предотвратить сбой службы. Есть ли способ сохранить службу, даже если у нее есть проблемы с подключением? - person Cool; 09.08.2011
comment
Это зависит от того, что вы подразумеваете под падением. Просто невозможность установить соединение должна вызывать проблемы только с запросом, в котором возникает эта проблема. Последующие запросы все еще могут быть обслужены; однако, если пул все еще исчерпан, они, очевидно, тоже потерпят неудачу. Если это так, то устранение утечек соединения является единственным правильным ответом. - person Ryan Stewart; 09.08.2011
comment
Выход из строя означает, что конкретные службы, для которых произошла утечка соединения, никогда не возвращаются, пока мы не перезапустим сервер. Все остальные службы будут работать нормально. выполнение услуги) - person Cool; 09.08.2011
comment
Это все еще не совсем описывает это. Когда служба выходит из строя и вы делаете к ней больше запросов, какой ответ вы получаете? Это 503? 500? 404? Или запрос просто висит навсегда? - person Ryan Stewart; 09.08.2011
comment
Когда служба выходит из строя, я получаю тот же ответ. Не удалось открыть соединение JDBC для транзакции; вложенным исключением является org.apache.commons.dbcp.SQLNestedException: не удается получить соединение, ошибка пула Время ожидания ожидания объекта бездействия, даже если БД работает. Также все остальные службы, находящиеся в состоянии войны и работающие с БД, работают нормально. - person Cool; 09.08.2011
comment
Именно так, чтобы служба не была отключена. Его пул соединений исчерпан. Просто исправьте утечку соединения. - person Ryan Stewart; 10.08.2011
comment
Что вы сделали, чтобы устранить утечку соединения? У нас точно такая же проблема! - person Rémi Roy; 10.08.2016

Вы можете попробовать изменить источник данных на: org.springframework.jdbc.datasource.DriverManagerDataSource

Лучше настроить источник данных с помощью JBoss и выполнить поиск Java EE-jndi. http://techdive.in/spring/spring-jndi-datasource-configuration-jboss

person Ashoka    schedule 10.08.2011
comment
Абсолютно не используйте DriverManagerDataSource для производства, если вы полностью не понимаете последствий. - person Ryan Stewart; 01.09.2011