Проблема тайм-аута JDBC getConnection

У меня есть приложение, которое использует пул соединений для получения соединения с базой данных из базы данных Oracle9i версии 9.2.0.4. Приложение размещено в SJSAS 8.1, а драйвер — ojdbc14.jar версии 10.1.0.4.

Проблема, с которой я сталкиваюсь, заключается в том, что метод datasource.getConnection() занимает около 40 секунд, чтобы создать исключение, когда БД не работает! Это приводит к перегрузке приложения во время сбоя БД. Я попытался установить LoginTimeout=8 с источником данных, но это не дало никакого эффекта.

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

<jdbc-connection-pool connection-validation-method="table" 
                      datasource-classname="oracle.jdbc.pool.OracleDataSource" 
                      fail-all-connections="true" 
                      idle-time out-in-seconds="600" 
                      is-connection-validation-required="true" 
                      is-isolation-level-guaranteed="false" 
                      max-pool-size="100" 
                      max-wait-time-in-millis="8000" 
                      name="mydb" 
                      pool-resize-quantity="80" 
                      res-type="javax.sql.DataSource" 
                      steady-pool-size="20" 
                      validation-table-name="dual">
    <property name="url" value="jdbc:oracle:thin:@server1:1521:mydb"/>
    <property name="user" value="user1"/>
    <property name="LoginTimeout" value="8"/>
    <property name="password" value="pass1"/>
</jdbc-connection-pool>

Может ли кто-нибудь помочь? Мне нужен метод getConnection() для тайм-аута с заданным тайм-аутом.


person Community    schedule 03.06.2009    source источник


Ответы (1)


Вот несколько вещей, которые можно попробовать:

Из «Руководства и справочника разработчика JDBC базы данных Oracle®».

Использование JDBC с брандмауэрами

Тайм-аут брандмауэра для незанятых соединений может разорвать соединение. Это может привести к зависанию приложений JDBC в ожидании соединения. Вы можете выполнить одно или несколько из следующих действий, чтобы избежать разрыва соединений из-за тайм-аута брандмауэра:

  • Если вы используете кэширование соединений или пул соединений, всегда устанавливайте значение времени ожидания бездействия в кеше соединений короче, чем значение времени ожидания простоя брандмауэра.
  • Передайте oracle.net.READ_TIMEOUT в качестве свойства подключения, чтобы включить тайм-аут чтения для сокета. Значение тайм-аута указано в миллисекундах.
  • Для драйверов JDBC OCI и JDBC Thin используйте сетевой дескриптор для подключения к базе данных и укажите параметр ENABLE=BROKEN в предложении DESCRIPTION в дескрипторе подключения. Кроме того, установите более низкое значение для tcp_keepalive_interval.
  • Включите Oracle Net DCD, установив SQLNET.EXPIRE_TIME=1 в файле sqlnet.ora на стороне сервера.
person mamboking    schedule 03.06.2009
comment
Вопрос о том, «когда БД не работает». Это делает весь ваш ответ неактуальным. - person user207421; 27.11.2016
comment
Это актуально. Первые 3 пункта — это все, что вы делаете на стороне клиента, а не на стороне БД. Речь идет о ускорении тайм-аута на стороне клиента. - person mamboking; 29.11.2016