Короткий ответ: нет (по умолчанию).
Для записи (включая детали здесь, в случае изменения линии связи), мы говорим о собственности maxLifetime
из HikariCP:
Это свойство определяет максимальное время жизни соединения в бассейне , Использованное соединение никогда не будет удалено, только когда оно будет закрыто, оно будет удалено. Мы настоятельно рекомендуем установить это значение, и оно должно быть как минимум на 30 секунд меньше, чем любая связанная с базами данных или инфраструктурой временная граница подключения. Значение 0 указывает максимальный срок службы (бесконечное время жизни), при условии, конечно, установки idleTimeout. По умолчанию: 1800000 (30 минут)
По моему опыту, это хорошо, что HikariCP делает это. Насколько я могу судить по умолчанию, Oracle не обеспечивает максимальное время жизни для соединений (ни на стороне драйвера JDBC (1), ни на стороне сервера (2)). Поэтому в этом отношении «время установления связи на основе инфраструктуры» равно + бесконечность - и это было проблемой для нас, поскольку мы наблюдали проблемы с долгоживущими соединениями. Это также означает, что любое значение «по крайней мере 30 секунд меньше», в том числе по умолчанию :)
Я полагаю слой соединения об этом ничего не делать, потому что он рассчитывает на слой бассейна выше обрабатывать такие вещи , Не удалось (теперь устарело) implicit connection pool, и я не знаю, делает ли это UCP (замена), но если вы используете HikariCP, вы не используете их.
Теперь, после 30 минут (обычно после многократного повторного использования для различных целей) для данного соединения, HikariCP закрывает его и создает новый. Это имеет очень незначительные затраты и устраняет проблемы с долговременными подключениями. Мы довольны этим дефолтом, но все же делаем его настраиваемым на всякий случай (см. 2 ниже).
(1) OracleDataSource
не предлагает (свойство или системное свойство) configuration point контролировать, и я наблюдал бесконечное время жизни.
(2) Для ограничений на стороне сервера см. profile parameter IDLE_TIME
. Цитирование this answer:
Oracle по умолчанию не будет закрывать соединение из-за неактивности. Вы можете настроить профиль с IDLE_TIME, чтобы заставить Oracle закрыть неактивные соединения.
Чтобы проверить, что это значение IDLE_TIME
для пользователя, сочетающий в себе ответы от this Q&A:
select p.limit
from dba_profiles p, dba_users u
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...'
;
По умолчанию значение UNLIMITED
.
Обратите внимание, что в других местах могут применяться другие ограничения (брандмауэр ... Да, я был укушен этим, хотя большинство систем БД имеют механизм поддержания работоспособности), который может мешать. Поэтому вам лучше настроить , если такие проблемы будут обнаружены при развертывании вашего продукта.
В Linux, вы можете проверить максимальный срок службы физических соединений путем мониторинга TCP сокетов, подключенных к вашей базе данных. Я выполнял сценарий ниже на моем сервере (с точки зрения БД, это клиент), он принимает 1 аргумент, ip:port
вашего оракульного узла, как он появляется в выводе netstat -tan
(или шаблон, если вы имеют несколько узлов).
#!/bin/bash
target="$1"
dir=$(mktemp -d)
while sleep 10
do
echo "------------ "$(date)
now=$(date +%s)
netstat -tan | grep " $target " | awk '{print $4}' | cut -f2 -d: | while read port
do
file="p_$port"
[ ! -e $file ] && touch $file
ftime=$(stat -c %Z "$file")
echo -e "$port :\t "$((now - ftime))
done
done
\rm "$dir"/p_*
\rmdir "$dir"
Если вы бежите, что и остановить его с Ctrl-C в течение sleep
времени, он должен выйти из цикла и очистить временный каталог, но это не 100% защиты
В результатах ни один из портов не должен показывать значение, превышающее 1800 секунд (т.е. 30 минут), дайте или возьмите минутку. См. Пример вывода ниже, первый образец показывает 2 сокета над 1800-ыми, они исчезли спустя 10 секунд.
------------ Thu Jul 6 16:09:00 CEST 2017
49806 : 1197
49701 : 1569
49772 : 1348
49782 : 1317
49897 : 835
49731 : 1448
49620 : 1830
49700 : 1569
49986 : 523
49722 : 1498
49715 : 1509
49711 : 1539
49629 : 1820
49732 : 1448
50026 : 332
49849 : 1036
49858 : 1016
------------ Thu Jul 6 16:09:10 CEST 2017
49806 : 1207
49701 : 1579
49772 : 1358
49782 : 1327
49897 : 845
49731 : 1458
49700 : 1579
49986 : 533
49722 : 1508
49715 : 1519
49711 : 1549
49732 : 1458
50026 : 342
49849 : 1046
49858 : 1026
Вам необходимо запустить скрипт для более чем 30 минут, чтобы увидеть, что, поскольку он не знает возраста сокетов, которые существовали до
Как вы проверяете maxLifeTime работает? – user7294900
Ах, хороший вопрос! На моем сервере у меня есть «Groovy Shell» (очень похоже на «Консоль скриптов» Дженкинса] (https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console)), который я использовал для проверки соединения объектов во время выполнения. И я мог убедиться, что после истечения срока Хикари закроет их и создаст свежие. Я не нахожусь на работе, поэтому я не могу точно показать, как именно сейчас (возможно, позже, если потребуется), но это была идея. Вы также можете использовать 'netstat' для проверки открытых сокетов TCP, подключенных к вашей БД, принять к сведению пары номеров портов и убедиться, что сокет не выдержал 30 минут. –
Я добавил рецепт, чтобы проверить, что в Linux (надеюсь, вы используете Linux ... на Mac, он также должен работать с минимальными изменениями) –