Подключение к нескольким серверам SQL Anywhere 11 с помощью JDBC или ODBC

Вот моя ситуация. У меня есть приложение (Mirth Connect), работающее на том же сервере, что и SQL Anywhere 11. В той же сети есть еще один сервер, на котором работает SQL Anywhere 11. Мне нужно подключиться к ним обоим. Оба они используют одно и то же имя сервера SQL Anywhere.

Мне нужно использовать соединение JDBC для подключения к любому из них в любой момент. Я могу подключиться к локальному экземпляру просто отлично.

Я попытался установить ODBC-соединение с удаленным сервером. Когда я проверяю соединение, он говорит, что все хорошо. Затем, когда я пытаюсь выполнить запрос, я замечаю, что подключен к локальному серверу. Это должно быть связано с тем, что оба сервера SQL Anywhere используют одно и то же «Имя сервера».

Как принудительно подключить соединение ODBC к удаленному серверу?

Благодарю вас!


person Garrett Fletcher    schedule 30.04.2012    source источник
comment
Укажите код, который вы используете для подключения к серверам. Скорее всего, вам нужно быть умным в отношении местоположения, к которому вы подключаетесь; как минимум два сервера должны разрешать две разные комбинации ip:port.   -  person Nathaniel Ford    schedule 01.05.2012


Ответы (1)


Вам необходимо указать IP-адрес (и порт, если он не используется по умолчанию) в строке подключения. Ваша строка подключения должна содержать параметр LINKS со (как минимум) следующими параметрами:

LINKS=tcpip(HOST=<remote IP address>;PORT=<remote port>;DoBroadcast=None)

Если удаленный сервер использует номер порта по умолчанию, 2638, вам не нужно указывать номер порта в строке подключения. DoBroadcast=None сообщает клиентской библиотеке, что она должна установить прямое соединение с этим хостом. По умолчанию (для версии 11 и старше) выполняется широковещательная рассылка по сети в поисках этого имени сервера, и выигрывает тот сервер, который ответит первым. Поскольку на локальной машине есть сервер, он, скорее всего, ответит первым.

Для версии 12 и выше вы можете заменить весь параметр LINKS новым параметром HOST:

HOST=<remote IP address>:<remote port>

который будет иметь то же поведение, что и параметр LINKS выше.

P.S. Рекомендуется давать каждому серверу уникальное имя сервера, что позволяет избежать необходимости жесткого кодирования IP-адреса хоста. Не говоря уже о том, что вы, должно быть, используете какой-то трюк, чтобы обмануть второй сервер, заставив его либо (а) думать, что его имя уникально, либо (б) не проверять, уникально ли оно, что он делает по умолчанию. Если вы используете уникальные имена серверов, вам не нужны эти дополнительные вещи.

Отказ от ответственности: я работаю в Sybase по разработке SQL Anywhere.

person Graeme Perrow    schedule 02.05.2012
comment
Хорошо, я добавил флаги LINKS и ENG в строку подключения. Теперь он подключается к локальной базе данных, а не к базе данных на сервере, указанном в разделе «Ссылки». Вот строка подключения, которую я использую сейчас. dbConn = DatabaseConnectionFactory.createDatabaseConnection('ianywhere.ml.jdbcodbc.jdbc3.IDrive', 'jdbc:ianywhere:Driver=SQL Anywhere 11;Eng=Bass;uid=dba;pwd=*;LINKS=tcpip(HOST=192.192.11.11 ;PORT=12345)' Почему он все еще смотрит на локальный сервер? Кроме того, я не могу контролировать имена служб. Я просто счастливчик, который должен подключаться к этим вещам :). - person Garrett Fletcher; 02.05.2012
comment
Также позволяет ли драйвер SQL Anywhere 11 напрямую подключаться к файлу базы данных с помощью строки DBF? Я тоже пробовал это, но у меня еще нет полного доступа к общему ресурсу. Я запросил полный доступ к общему ресурсу. - person Garrett Fletcher; 02.05.2012
comment
Ага - вы используете v11. Если вы обновитесь до v12, все будет в порядке, но v11 и более ранние версии ведут себя немного по-другому в отношении параметра HOST. Обновлю свой ответ. - person Graeme Perrow; 03.05.2012
comment
Вы великолепны! Это помогло. Пришлось, правда, немного подправить. Вместо DoBroadcast=None мне пришлось использовать DoBroadcast=Direct. Я предполагаю, что это из-за того, как сервер транслирует имя сервера? Я нашел статью о DoBroadcast здесь: dcx.sybase.com/ 1200/en/dbadmin/dobroadcast-network-conparm.html Вот моя окончательная строка подключения: var dbConn = DatabaseConnectionFactory.createDatabaseConnection('ianywhere.ml.jdbcodbc.jdbc3.IDriver','jdbc:ianywhere:Driver= SQL Anywhere 11;uid=dba;pwd=*;Eng=VP_2;LINKS=tcpip(HOST=192.168.1.110;PORT=49193;DoBroadcast=Direct)'); - person Garrett Fletcher; 03.05.2012
comment
Это часть строки, которая, вероятно, будет полезна всем, кто читает этот пост: 'jdbc:ianywhere:Driver=SQL Anywhere 11;uid=dba;pwd=*;Eng=VP_2;LINKS=tcpip(HOST=192.168. 1.110;PORT=49193;DoBroadcast=Direct)' - person Garrett Fletcher; 03.05.2012