2016-09-30 1 views
2

В документации HikariCP упоминается, чтоHikariCP: Какие базы данных ожидания уровня следует рассматривать как набор maxLifetime для Oracle 11g

Мы настоятельно рекомендуем установить это значение, и оно должно быть не менее 30 секунд меньше чем любой тайм-аут соединения на уровне базы данных.

Каковы эти тайм-ауты соединения на уровне базы данных, которые необходимо учитывать для базы данных Oracle11.2? И как я могу найти эти таймауты (запросы для выполнения)?

ответ

1

Короткий ответ: нет (по умолчанию).


Для записи (включая детали здесь, в случае изменения линии связи), мы говорим о собственности 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 минут, чтобы увидеть, что, поскольку он не знает возраста сокетов, которые существовали до

+0

Как вы проверяете maxLifeTime работает? – user7294900

+0

Ах, хороший вопрос! На моем сервере у меня есть «Groovy Shell» (очень похоже на «Консоль скриптов» Дженкинса] (https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console)), который я использовал для проверки соединения объектов во время выполнения. И я мог убедиться, что после истечения срока Хикари закроет их и создаст свежие. Я не нахожусь на работе, поэтому я не могу точно показать, как именно сейчас (возможно, позже, если потребуется), но это была идея. Вы также можете использовать 'netstat' для проверки открытых сокетов TCP, подключенных к вашей БД, принять к сведению пары номеров портов и убедиться, что сокет не выдержал 30 минут. –

+1

Я добавил рецепт, чтобы проверить, что в Linux (надеюсь, вы используете Linux ... на Mac, он также должен работать с минимальными изменениями) –

Смежные вопросы