Проблема с драйвером Oracle 19c JDBC (Instant client basiclite)

#java #oracle #ojdbc #jdbc-odbc

Вопрос:

Я работаю над обновлением драйвера oracle jdbc с 11g (ojdbc6.jar) до 19с (ojdbc8.jar) в моем java-приложении используется драйвер Instant Client (instantclient-basiclite-nt-19.11) с JRE1.8.0_271. После изменения на 19c мое приложение продолжает нажимать «ORA-02396: превышено максимальное время простоя, пожалуйста, снова подключитесь» или «ORA-03113: ошибка в конце файла».

В свойствах базы данных oracle установлены некоторые ограничения: Время простоя = 2 минуты и Время подключения = 10 минут. Но я не буду вносить никаких изменений в базу данных, потому что это может привести к высокой производительности процессора, если многие пользователи используют приложение одновременно.

В Java-приложении соединение хранится в пуле соединений, я помещаю журнал и вижу, что соединение закрыто, и возвращаюсь в пул соединений после завершения выполнения. Но когда я снова запустил приложение через 2 минуты, возникла ошибка oracle.

Если я переключусь обратно на 11g, я не получу такой ошибки, и приложение будет нормально работать через 2 минуты. Никаких изменений в коде.

Это ошибка в последнем драйвере oracle? Я видел, что есть UCP.jar Пакет (Универсальный пул соединений) доступен в 19c, но не в 11g, это я реализовал это? и как?

Комментарии:

1. Вы можете настроить пул подключений для проверки подключений перед их повторным использованием.

2. @tgdavies, что нужно настроить в пуле соединений?

3. Ознакомьтесь с документацией для любого пула соединений, который вы используете.

4. Драйвер JDBC не нуждается в мгновенном клиенте

5. Вы можете извлечь драйверы из Maven Central; см. Руководство @ oracle.com/database/technologies/maven-central-guide.html

Ответ №1:

Ваша проблема не имеет ничего общего с драйвером, но с настройкой профиля базы данных, которая ограничивает максимально допустимое время простоя. Обычно это делается для того, чтобы избавиться от забытых сеансов.

Вы можете проверить это с помощью

 select a.username,b.profile,b.RESOURCE_NAME,b.LIMIT from dba_users a, dba_profiles b where  b.resource_name='IDLE_TIME' and a.profile=b.profile;
 

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

если это профиль по умолчанию, он может быть изменен на неограниченный

 ALTER PROFILE DEFAULT LIMIT IDLE_TIME UNLIMITED;
 

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

Если ограничение времени ожидания не может быть изменено, время от времени выполняйте запрос, например select 'keep me alive from dual; , это также предотвращает закрытие брандмауэрами.

Комментарии:

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

2. ерунда. Незанятые сеансы не потребляют процессор. Они просто используют память. Принудительное создание новых сеансов путем их уничтожения с помощью профиля приводит к увеличению загрузки процессора.