Java GSS/JDBC Issue
У меня есть немного необычная проблема, которую я пытаюсь решить. Я развиваюсь на Mac. Я пишу код, который подключается к базе данных, используя jdbc. У меня нет прямого доступа к db-серверу - чтобы добраться до него, мне нужно настроить переадресацию портов по ssh, который идет на прокси-сервер в сети, где находится db-сервер. Сервер, на котором я прокси, является сервером Linux, а база данных - MS Sql Server в Windows. После настройки перенаправления портов я могу подключиться к базе данных с помощью инструмента просмотра БД, такого как SquirrelSQL. Когда я пытаюсь подключиться к базе данных, используя написанный мной код jdbc, используя точно такой же драйвер JDBC, я получаю следующее:
Exception in thread "main" java.sql.SQLException: I/O Error: GSS Failed: Invalid name provided (Mechanism level: Cannot locate default realm)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:654)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:371)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:233)
at sql.generator.SQLGenerator.main(SQLGenerator.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.io.IOException: GSS Failed: Invalid name provided (Mechanism level: Cannot locate default realm)
at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1976)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:617)
... 10 more
Исследования Google показывают, что это может быть проблема с Kerberos, с которой мне раньше не приходилось работать, но я не уверен, что это правильно. Что делает браузер БД, который мне нужно дублировать в приложении?
ТИА, Алекс
1 ответ
Этот тоже меня укусил. Проверьте ваш DriverManager.getConnection вызов. Я использовал вариант, который принимает свойства в качестве второго аргумента. Но jTDS использует это не так, как драйвер M$. Вы должны использовать вариант с аргументами URL, имени пользователя и пароля. Убедитесь, что вы добавили номер порта и (необязательно) имя базы данных в URL-адрес подключения.