Переключение на несколько IP-адресов

Разработал приложение на стороне клиента, которое обращается к серверу баз данных oracle 12c с помощью ODP.NET. У меня есть 2 сетевых адаптера на клиенте и сервере. Сервер прослушивает оба сетевых рельса на разных портах.

Если я потяну сетевой кабель со стороны сервера, клиенту потребуется около 21 секунды, чтобы он переключился на другую сетевую шину для связи с базой данных. Как я могу ускорить это? Я использовал TCP.CONNECT_TIMEOUT, TRANSPORT_CONNECT_TIMEOUT и CONNECTION_TIMEOUT, но, похоже, ничего не применимо. Я применил TCP.CONNECT_TIMEOUT как на sqlnet.ora, так и на уровне приложений, но ничего не работает. TNSPING и sqlplus работают нормально и переключаются при сбое в соответствии с заданным временем ожидания.

Похоже, что OPD.NET не уделяет много внимания в разделе "Описание". Из любопытства я проверил другие вещи, такие как отключение FAILOVER=, и оно все равно отказывает. Я также разместил раздел описания в строке подключения под тегом "источник данных". Еще ничего. Есть ли ошибка в ODP.NET?

Пожалуйста помоги. -Давид


Клиент:

DBSVR =
  (DESCRIPTION =
    (RETRY_COUNT = 0)
    (LOAD_BALANCE = off)
    (FAILOVER = on)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.11)(PORT = 1526))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DBSVR)
      (FAILOVER_MODE =
        (TYPE = select)
        (METHOD = basic)
      )
    )
  )

Настройки как в sqlnet.ora, так и в app.config:

TCP.CONNECT_TIMEOUT = 3
TRANSPORT_CONNECT_TIMEOUT = 3
CONNECTION TIMEOUT = 60

Выдержка из файла трассировки:

2017-02-26 16:21:27.818678 TID:1   (CFG) (SQLNET)   SQLNET.AUTHENTICATION_SERVICES : (none)
2017-02-26 16:21:27.820678 TID:1   (CFG) (SQLNET)   TRACE_LEVEL_CLIENT : SUPPORT
2017-02-26 16:21:27.820678 TID:1   (CFG) (SQLNET)   TRACE_DIRECTORY_CLIENT : C:\OracleTrace
2017-02-26 16:21:27.820678 TID:1   (CFG) (SQLNET)   TRACE_FILE_CLIENT : client_trace.log
2017-02-26 16:21:27.820678 TID:1   (CFG) (SQLNET)   DIAG_ADR_ENABLED : OFF
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      Machine Name : CASGUI2
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      User Name : aimscsadmin
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      OS Version : Microsoft Windows NT 6.1.7601 Service Pack 1
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      64-bit OS : True
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      64-bit Process : False
2017-02-26 16:21:27.822678 TID:1   (CFG) (ENV)      .NET Runtime Version : 4.0.30319.42000
2017-02-26 16:21:27.822678 TID:1   (CFG) (VER)      Oracle Data Provider for .NET, Managed Driver Version : 4.121.2.0
2017-02-26 16:21:27.822678 TID:1   (CFG) (VER)      Oracle Data Provider for .NET, Managed Driver Informational Version : 4.121.2.20141216 ODAC RELEASE 3
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TraceLevel : 7
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TRANSPORT_CONNECT_TIMEOUT : 6
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TRACE_FILE_CLIENT : client_trace.log
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     DIAG_ADR_ENABLED : OFF
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TCP.CONNECT_TIMEOUT : 3
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TRACE_DIRECTORY_CLIENT : C:\OracleTrace
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     TRACE_LEVEL_CLIENT : SUPPORT
2017-02-26 16:21:27.822678 TID:1   (CFG) (.NET)     SQLNET.AUTHENTICATION_SERVICES : (none)
2017-02-26 16:21:27.823679 TID:1   (CFG) (TNSNAMES) DBSVR : (DESCRIPTION =(RETRY_COUNT = 0)(LOAD_BALANCE = off)(FAILOVER = on)(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.11)(PORT = 1526)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = DBSVR)(FAILOVER_MODE =(TYPE = select)(METHOD = basic))))
2017-02-26 16:21:27.826679 TID:1   (CFG) (SQLNET)   FilePath : C:\oracle\product\12.1.0\client_1\network\admin\sqlnet.ora
2017-02-26 16:21:27.826679 TID:1   (CFG) (TNSNAMES) FilePath : C:\oracle\product\12.1.0\client_1\network\admin\tnsnames.ora
2017-02-26 16:21:27.826679 TID:1   (PUB) (ENT) OracleConnection.ctor()
2017-02-26 16:21:27.829679 TID:1   (PRI) (ENT) (CP) ConnectionString.GetCS()
2017-02-26 16:21:27.831679 TID:1   (PRI) (ENT) (CP) ConnectionString.ctor()
2017-02-26 16:21:27.834679 TID:1   (PRI) (ENT) (CP) ConnectionString.Parse()
2017-02-26 16:21:27.837679 TID:1   (PRI) (ENT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (ENT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (ENT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (ENT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.SetProperty()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.Parse()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.ctor()
2017-02-26 16:21:27.837679 TID:1   (PRI) (EXT) (CP) ConnectionString.GetCS()
2017-02-26 16:21:27.838679 TID:1   (PUB) (EXT) OracleConnection.ctor()
2017-02-26 16:21:27.873681 TID:1   (PUB) (ENT) OracleConnection.Open() (conid=45028263) (state=Closed) (sessid=0) (implid=0) (pooling=T) (txnid=n/a)
2017-02-26 16:21:27.874681 TID:1   (PRI) (ENT) (CP) OracleConnectionDispenser`3..cctor()
2017-02-26 16:21:27.875681 TID:1   (PRI) (EXT) (CP) OracleConnectionDispenser`3..cctor()
2017-02-26 16:21:27.875681 TID:1   (PRI) (ENT) (CP) OracleConnectionDispenser`3.Get()
2017-02-26 16:21:27.876682 TID:1   (PRI) (ENT) (CP) PoolManager`3.ctor()
2017-02-26 16:21:27.877682 TID:1   (PRI) (EXT) (CP) PoolManager`3.ctor()
2017-02-26 16:21:27.878682 TID:1   (PRI) (ENT) (CP) PoolManager`3.Initialize() (constr=data source=dbsvr;user id=USR1;Connection Timeout=60;)
2017-02-26 16:21:27.878682 TID:1   (PRI) (ENT) (CP) ConnectionString.Secure()
2017-02-26 16:21:27.879682 TID:1   (PRI) (EXT) (CP) ConnectionString.Secure()
2017-02-26 16:21:27.882682 TID:1   (PRI) (EXT) (CP) PoolManager`3.Initialize() (pmid=56648283) (constr=data source=dbsvr;user id=USR1;Connection Timeout=60;)
2017-02-26 16:21:27.882682 TID:1   (PRI) (BUF) (OBP.CTOR) (poolid:40072506) (OracleConnectionDispenser`3.GetPM)
2017-02-26 16:21:27.884682 TID:1   (PRI) (ENT) (CP) OraclePoolManager.Get()
2017-02-26 16:21:27.887682 TID:1   (PRI) (ENT) (CP) PoolManager`3.Get() (txnid=n/a) (bForceMatch=F)
2017-02-26 16:21:27.889682 TID:1   (PRI) (ENT) (CP) PoolManager`3.CreateNewPR() (txnid=n/a)
2017-02-26 16:21:28.027690 TID:1   (PRI) (ENT) TimeStamp.GetLocalTZOffset()
2017-02-26 16:21:28.027690 TID:1   (PRI) (EXT) TimeStamp.GetLocalTZOffset()
2017-02-26 16:21:28.029690 TID:1   (PRI) (ENT) (CP) ConnectionString.GetStringFromSecureString()
2017-02-26 16:21:28.029690 TID:1   (PRI) (EXT) (CP) ConnectionString.GetStringFromSecureString()
2017-02-26 16:21:28.031690 TID:6   (PRI) (ENT) (CP) PoolManager`3.CreateNewPRThreadFunc()
2017-02-26 16:21:28.033691 TID:6   (PRI) (SVC) (ENT) OracleConnectionImpl.Connect() (oper=open) (aff=n/a) (inst=) (affmatch=n/a) (sessid=-1:-1) (F;F;F;;N) (pmid=56648283)
2017-02-26 16:21:28.034691 TID:6   (PRI) (BUF) (COBP.CTOR) (poolid:1) (parentpoolid:40072506) (OracleConnectionImpl.Connect)
2017-02-26 16:21:49.046892 TID:6   (PRI) (BUF) (ALLOCATION) (bufid:1)

1 ответ

Вы предоставили трассировку для основного потока пула. Можете ли вы также предоставить файл трассировки потока установления соединения, чтобы мы могли видеть, на чем он висит?

Извините, я бы поставил это как комментарий вместо ответа, но ТАК не позволил бы мне.

Обратите внимание, вы правы. ODP.Managed не поддерживает (failover=). ODP.Managed поддерживает только аварийное переключение (не поддерживает балансировку нагрузки address_list), поэтому ЕДИНСТВЕННАЯ цель address_list - аварийное переключение.

Кроме того, ODP.Managed не поддерживает повторные попытки (retry_count и retry_delay).

Другие вопросы по тегам