Время ожидания JDBC getConnection - PullRequest
0 голосов
/ 03 июня 2009

У меня есть приложение, которое использует пул соединений для получения соединения с базой данных из базы данных 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() для тайм-аута с указанным тайм-аутом.

1 Ответ

0 голосов
/ 04 июня 2009

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

Из "Руководства и справочника разработчика JDBC для Oracle® Database".

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

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

  • Если вы используете кеширование соединения или пул соединений, то всегда установить значение времени ожидания неактивности на кеш соединения должен быть короче чем значение времени ожидания простоя брандмауэра.
  • Pass oracle.net.READ_TIMEOUT as свойство соединения для включения чтения тайм-аут на сокете. Значение тайм-аута в миллисекундах.
  • Для JDBC OCI и JDBC Thin драйверы, используйте сетевой дескриптор для подключиться к базе данных и указать параметр ENABLE = BROKEN в ОПИСАНИЕ предложение в соединении дескриптор. Также установите меньшее значение для tcp_keepalive_interval.
  • Включите Oracle Net DCD, установив SQLNET.EXPIRE_TIME=1 в sqlnet.ora файл на стороне сервера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...