#java #oracle #hikaricp #ucp
#java #Oracle #hikaricp #ucp
Вопрос:
Мое понимание экосистемы ограничено, поэтому извините за мое невежество.
У меня действительно большая база данных Oracle (19) с большим количеством подключений к ней из нескольких приложений. Мы установили для него некоторый предел максимального количества подключений (сеансов), и мы можем довольно легко достичь этого предела.
Мы используем Java 17 Spring Boot 2.6.1 и HikariCP (с учетом UCP) и JDBI3
Когда я запускал свое приложение перед добавлением пулов подключений, я заметил, что когда я неблагодарно прерываю свое соединение (принудительно убиваю приложение), соединение поддерживается на стороне Оракула довольно долго (30m ).). Как это обрабатывается при завершении работы приложения с пулами соединений? Я предполагаю, что пул соединений будет отключен из-за тайм-аутов TCP вместо TCP FIN / ACK и что это работает по-другому, поскольку приложение отключается до того, как сможет отключить соединения, но означает ли это, что соединения на стороне Oracle останутся живыми, как и раньше?
TL; DR: нужно ли мне обрабатывать неблагодарное завершение работы, закрыв пул соединений вручную, чтобы Oracle не поддерживала мертвые соединения?
В качестве альтернативы мне нужно было бы связаться с нашей командой Oracle и каким-то образом убедить их снизить это значение поддержки, которое они, похоже, имеют на своей стороне.
Комментарии:
1. Вы используете пул соединений (Hikari), поэтому не знаете, почему вы думаете, что не используете пул соединений.
2. Я немного изменил текст: «Когда я запускал свое приложение перед добавлением пулов соединений». Основная часть вопроса заключается в том, обрабатывают ли пулы соединений неблагодарные отключения, а Oracle поддерживает сеанс. Неблагодарное завершение или прямое вытягивание электрического кабеля.
3. Spring Boot по умолчанию использует пул соединений, поэтому, если вы явно не отключили его / не переопределили, вы с самого начала использовали пул соединений. Я также не уверен, что вы имеете в виду под неблагодарным завершением работы, каждое завершение работы приложения Spring Boot приведет к закрытию контекста приложения и, следовательно, пула соединений (если вы не неправильно настроили вещи вручную самостоятельно!). Если вы не убиваете приложение напрямую, что предотвращает завершение работы, все будет закрыто. В последнем случае вы ничего не сможете сделать, чтобы закрыть что-то после этого (на стороне приложения).
4. Вы уверены? Журнал «Запуск HikariCP» не отображается, если я не добавлю HikariCP в настройках spring. Также поведение было другим после его добавления.
5. это не может зависеть от использования пула соединений: с точки зрения ОС «прямые» и «cp» соединения являются сокетами, если вы выпускаете
kill -9
приложение, у него нет возможности обрабатывать его, поэтому оно обрабатывается ОС — оно отправляет либо FIN, либо RST. НО поведение в реальном мире может зависеть отразличные факторы (поставщик ОС, версия, брандмауэры и т. Д.), Например: access.redhat.com/discussions/2990731 , того , что вы предоставили, недостаточно.
Ответ №1:
Вы можете попробовать использовать Универсальный пул подключений (UCP), он имеет встроенный механизм для корректного закрытия соединений при завершении работы приложения / JVM.