2016-04-15 3 views
0

У меня есть приложение, в котором соединение DB создается конфигурацией Spring (затем переходит в спящий режим). Ниже приведены параметры по умолчанию в нашем весеннем файле.Соединение с пружиной DBCP завершается

<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"> 
    <value>${database.driver}</value> 
    </property> 
    <property name="url"> 
    <value>${dbUrl}</value> 
    </property> 
    <property name="username"> 
    <value>${dbUser}</value> 
    </property> 
    <property name="password"> 
    <value>${dbPassword}</value> 
    </property> 
</bean> 

Однако в определенной среде соединения Oracle DB закрываются сетевыми настройками через определенный промежуток времени. Первоначально мы думали, что закрытие соединений связано с отсутствием соединений. Мы добавили validationQuery, чтобы периодически отправлять запрос на сервер, чтобы соединения не были простаивают.

<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"> 
    <value>${database.driver}</value> 
    </property> 
    <property name="url"> 
    <value>$dbUrl</value> 
    </property> 
    <property name="username"> 
    <value>$dbUser</value> 
    </property> 
    <property name="password"> 
    <value>$dbPassword</value> 
    </property> 
    <property name="validationQuery"> 
    <value>SELECT 1 FROM dual</value> 
    </property> 
    <property name="testWhileIdle"> 
    <value>true</value> 
    </property> 
    <property name="testOnReturn"> 
    <value>true</value> 
    </property> 
    <property name="timeBetweenEvictionRunsMillis"> 
    <value>1000</value> 
    </property> 
</bean> 
  1. Даже после того, как выше настройки соединения по-прежнему получать закрыты.
  2. Также отмечено, что, когда приложение простаивает в течение 2-3 (разных) часов, запрос проверки прекращает выполнение на сервере, а затем соединения закрываются по сетевым настройкам.

Мой вопрос заключается в добавлении validationQuery гарантирует, что соединения не простаивают? Приложение не работает при первой попытке входа в систему, не вызывая никакого соединения с БД; но работает после 2-3 попыток. Не уверен, что здесь происходит.

ответ

1

Проверка validationQuery используется только для проверки соединения, когда он извлекается из пула соединений. См.: https://commons.apache.org/proper/commons-dbcp/configuration.html

Кроме того, я видел нечетное поведение с org.apache.commons.dbcp.BasicDataSource и Oracle (11 и 12). У нас была намного лучшая стабильность с org.apache.tomcat.dbcp.dbcp.BasicDataSource. Параметры конфигурации довольно близки (возможно, идентичны?) Для реализации dbcp commons, поэтому преобразование является быстрым.

+0

Спасибо за помощь мне понять validationQuery. Для # 2 в моем вопросе это было фактически minEvictableIdleTimeMillis, заставляющее validationQuery не запускаться. – dRv

0

На стороне записки библиотеки C3P0 Connection Pool намного лучше, чем DBCP. У меня всегда были проблемы в прошлом с ГСБД, с тех пор не перешли на C3P0 никаких проблем до сих пор ...

http://www.mchange.com/projects/c3p0/