#c# #oracle12c #tnsnames
#c# #oracle12c #tnsnames
Вопрос:
Я работаю над веб-приложением, которое будет развернуто на отдельных серверах приложений, каждый из которых подключается к другой базе данных Oracle. Соединения с БД указаны в файле tnsnames.ora каждого сервера приложений. Кроме того, каждая запись tns names использует несколько IP-адресов базы данных для обработки отказоустойчивости.
ABCD =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = on)
(LOAD_BALANCE = off)
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.5)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.10)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abcd)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
)
)
)
Я пытаюсь найти способ получить IP-адрес базы данных, которую в данный момент использует сервер приложений.
Я искал везде, но не могу найти решение и, честно говоря, даже не знаю, выполнимо ли это.
Я могу выполнить:
netstat -a | findstr ":1521"
TCP 10.20.30.40:52707 Blah1:1521 ESTABLISHED
TCP 10.20.30.40:57022 Blah2:1521 ESTABLISHED
TCP 10.20.30.40:57024 Blah3:1521 ESTABLISHED
чтобы найти все подключения, выполненные к порту 1521, который используется Oracle DB. Затем я должен иметь возможность выполнить nslookup, чтобы получить IP-адрес Blah1, Blah2 и Blah3.
Возможно, мне придется проанализировать файл tnsnames.ora, используя имя записи tns, используемое приложением (ABC); затем сравните IP, который я получаю из nslookup, чтобы увидеть, какой из них соответствует.
Есть ли встроенный способ сделать это? Кто-нибудь сталкивался с этой ситуацией и сумел ее разрешить? Как я могу определить, является ли это 1.2.3.4 или 1.2.3.5 или 1.2.3.10, к которому подключается приложение?
Комментарии:
1. Я предполагаю, что смысл наличия нескольких адресов заключается в том, что каждое подключение к базе данных будет осуществляться по тому адресу, который доступен в данный момент. И только потому, что произошел сбой при одном соединении, не означает, что он завершится сбоем при следующем; это может быть временным. Если возможно ответить на ваш вопрос, его необходимо будет проверить на
OracleConnection
уровне для данного активного соединения, а не приложения в целом.2. netstat -o будет включать идентификатор процесса.
3. Я действительно пробовал netstat -a -o -b. Возвращены три записи, но не уверен, что делать с PID.
4. @madreflection Это был еще один вариант, о котором я думал: установите соединение с базой данных Oracle и проверьте свойства соединения и посмотрите, включает ли оно имя хоста DB или IP. Не уверен, что это так, но могу попробовать.
5. @madreflection создание соединения с Oracle, его открытие и проверка его свойств были способом сделать это, как вы предложили. Я мог видеть из свойства HostName объекта connection имя сервера БД, из которого я могу получить IP-адрес. Пожалуйста, измените свой комментарий на ответ, и я отмечу его как таковой. Вы можете добавить то, что я упоминал о получении имени хоста из conn. объект. Спасибо.