#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. ерунда. Незанятые сеансы не потребляют процессор. Они просто используют память. Принудительное создание новых сеансов путем их уничтожения с помощью профиля приводит к увеличению загрузки процессора.