我们已经为dataguard数据库配置了oracle TAF (透明应用程序故障切换),以便应用程序可以在主数据库出现任何问题时使用相同的服务名连接数据库,并且必须切换到备用数据库。但是,我们遇到了一个独特的问题,数据中心内的应用程序服务器能够连接到数据库,但是来自不同数据中心的服务器无法使用taf服务..after 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 morepcdrest_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 发布于 2019-06-05 15:35:06
请注意,在没有任何警告的情况下,Oracle在版本12.1中将transport_connect_timeout的含义从秒更改为毫秒。因此,如果你使用这个版本,就无法判断3是秒还是毫秒。
从版本12.2开始,您的值3(微秒)值太低。
此外,Oracle JDBC驱动程序中有几个与TAF相关的错误。例如:
时尝试连接的总次数
RETRY_COUNT连接参数是在初始连接尝试失败后应进行的额外连接尝试次数。因此,如果RETRY_COUNT为2,则将为ADDRESS_LIST中的每个地址进行最多3次连接尝试。然而,JDBC thin将RETRY_COUNT视为连接尝试的总次数,因此,在上面的示例中,JDBC thin将对每个地址进行最多2次尝试,而不是预期的3次。
这是错误12760352的后续,在使用JDBC thin时,ADDRESS_LIST中的地址以错误的顺序被重试(例如,如果地址列表包含A和B,则JDBC thin将尝试以A A ...B B ..。而不是A B A B ...)。
PS:参数retry_delay似乎从版本开始就被JDBC驱动程序忽略了。12摄氏度或更高。
https://stackoverflow.com/questions/56452277
复制相似问题