java.sql.SQLRecoverableException - переподключиться из jdbc - PullRequest
1 голос
/ 13 мая 2019

В моем приложении, которое использует подключение Apache JDBC для подключения к базе данных, я иногда получаю "java.sql.SQLRecoverableException". После поиска основной причины я смог узнать, что это может быть вызвано прекращением соединения со стороны сервера Oracle. Я использую версию Oracle 11G.

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

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

select * from v$session where username is not null;

Отображает один результат, когда у меня открыт SQL Developer, а также открыты приложения (2 приложения, использующие одинаковые учетные данные пользователя). Я хочу знать, как прекратить соединение с SQL и воспроизвести «SQLRecoverableException» для тестирования, а также повторно подключиться к базе данных после возникновения проблемы.

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

Мое подключение JDBC в spring-servlet.xml приведено ниже:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${myjdbc.driverClassName}" />
    <property name="url" value="${myjdbc.url}" />
    <property name="username" value="${myjdbc.username}" />
    <property name="password" value="${myjdbc.password}" />
</bean>
<context:property-placeholder location="classpath:myjdbc.properties" />

1 Ответ

1 голос
/ 13 мая 2019

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

Чтобы устранить эту проблему, мы настроили пул базы данных, указав следующие свойства

testOnBorrow:-Setting it true will force the pooling provider to run the validation query while handing out the connection to the application.
testWhileIdle:-Setting it true will enable the validation when the connection is sitting idle in the pool.
timeBetweenEvictionRunsMillis:- Setting this property to non-zero will allow the evictor thread to run,which will test the idle connections.

Воспроизведениепроблема потребует уничтожения соединения на стороне базы данных. Мы провели небольшой тест с использованием mssql, в котором мы можем разорвать соединение с помощью средств сервера, и пул снова устанавливал соединение.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${myjdbc.driverClassName}" />
    <property name="url" value="${myjdbc.url}" />
    <property name="username" value="${myjdbc.username}" />
    <property name="password" value="${myjdbc.password}" />
    <property name="testOnBorrow" value="true" />
    <property name="testWhileIdle" value="true" />
    <property name="timeBetweenEvictionRunsMillis" value="3000" />
</bean>

Обратите внимание наtimeBetweenEvictionRunsMillis указывается в миллисекундах.

Приведенная выше конфигурация проверяет недопустимые соединения и удаляет их из пула, если они внезапно закрываются базой данных или брандмауэром.

...