Проблемы с Oracle Dataguard TAF (прозрачное переключение приложений) - PullRequest
0 голосов
/ 05 июня 2019

мы настроили oracle TAF (прозрачное переключение приложений) для базы данных dataguard, чтобы приложение могло использовать одно и то же имя службы для подключения к базе данных в случае любой проблемы с первичной базой данных и нам пришлось переключиться на резервную базу данных, но у нас возникла уникальная проблемагде серверы приложений в центре обработки данных могут подключаться к БД, но серверам из другого центра обработки данных не удается подключиться с использованием службы taf. после 90-секундного интервала ожидания происходит попытка подключения к резервному хосту и сбой

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

Ошибка:

Caused by: java.io.IOException: Socket read timed out, socket connect lapse 3 ms. plx9852.xyz.com/135.167.30.103 1524 3 1 true 
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:209) 
at oracle.net.nt.ConnOption.connect(ConnOption.java:161) 
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470) 
... 54 more
pcdrest_taf.db.xyz.com=
(description=(connect_timeout=90)(retry_count=30)(retry_delay=3)(transport_connect_timeout=3)(load_balance=off)(failover=on)(address_list=(address=(protocol=tcp)(host=plx9843.xyz.com)(port=1524))(address=(protocol=tcp)(host=plx9852.xyz.com)(port=1524)))(connect_data=(service_name=pcdrest_taf.db.xyz.com)(failover_mode=(type=select)(method=basic))))

строка подключения в приложении с использованием LDAP:

spring.datasource.jdbcUrl=jdbc:oracle:thin:@ldap://polarx.xyz.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com ldap://polarx1.xyz.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com ldap://polarx2.sbc.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com ldap://polarx3.sbc.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com ldap://polarx4.sbc.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com ldap://polarx5.sbc.com:3060/pcdrest_taf,cn=OracleContext,dc=db,dc=xyz,dc=com 

1 Ответ

0 голосов
/ 05 июня 2019

Остерегайтесь, Oracle изменил значение transport_connect_timeout с секунд на миллисекунды без каких-либо предупреждений в выпуске 12.1. Так что, если вы используете эту версию, нет способа определить, означает ли 3 секунды или миллисекунды.

Начиная с версии 12.2, ваше значение 3 (минсекунды) слишком мало.

Кроме того, в драйвере Oracle JDBC было несколько ошибок, связанных с TAF. Например:

  • Ошибка 12998506 Параметр подключения RETRY_COUNT - это общее количество попыток подключения при использовании тонкого описания JDBC

Параметр соединения RETRY_COUNT - это количество дополнительных раз попытка подключения должна быть предпринята после первоначальной попытки не удалось. Следовательно, если RETRY_COUNT равно 2, то максимум 3 соединения попытки будут сделаны для каждого адреса в ADDRESS_LIST. тем не мение JDBC thin принимает значение RETRY_COUNT для обозначения общего количества соединений попытки, так что в приведенном выше примере JDBC thin будет составлять максимум 2 попытки для каждого адреса вместо ожидаемого 3.

Это продолжение ошибки 12760352, где адреса в ADDRESS_LIST пытался в неправильном порядке при использовании JDBC тонкий (например, если список адресов содержит A и B, JDBC thin будет попытаться подключиться как A A ... B B ... вместо A B A B ...).

PS: параметр retry_delay, похоже, игнорируется драйверами JDBC, начиная с версии. 12c и выше.

...