Class.forName не работает в вызове Java RMI - PullRequest
1 голос
/ 27 ноября 2009

Как повлияет Java RMI на следующую строку кода?

Class.forName ( "com.microsoft.sqlserver.jdbc.SQLServerDriver");

Это не работает для меня при вызове RMI. Я новичок в Java и RMI, поэтому, пожалуйста, подробно опишите ваш ответ.

Edit:

//String connect to SQL server
String url = "jdbc:sqlserver://" + strServerIPAddress + ":1433" + ";DatabaseName=" + strDatabaseName;

try {

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

} 
catch (java.lang.ClassNotFoundException e) 

{ 
    System.out.println(e.getCause().toString());
    return false;
}

Я вставил код. Подскажите, пожалуйста, как получить полную трассировку стека?

Вот командный файл, который я использую для запуска моего кода

% Я в моем исходном коде dir

javac -d classes -cp classes *.java
rmic -classpath classes -d classes myrmi.DummyImpl myrmi.BookImpl    
start rmiregistry -J-Dsun.rmi.loader.logLevel=VERBOSE

start java -cp classes -Djava.rmi.server.codebase=file:///C:\NetBeansProjects\MyProject\src\myrmi\classes\ -Djava.security.policy=java.policy 

myrmi.Server SEB 
start java -cp classes -Dsun.rmi.loader.logLevel=VERBOSE  -Djava.security.policy=java.policy myrmi.Client 

Ответы [ 3 ]

2 голосов
/ 27 ноября 2009

Доступен ли файл JAR с com.microsoft.sqlserver.jdbc.SQLServerDriver по пути к классам виртуальной машины, на которой работает удаленный экземпляр?

-cp классы будут захватывать только файлы .class, поэтому, если SQLDriver находится в файле JAR или ZIP (что, вероятно, и есть), он не будет найден. Вам нужно будет выполнить "-cp classes; <путь к драйверу>"

0 голосов
/ 27 ноября 2009

Вероятная причина в том, что у вас нет прав ни для загрузки драйвера, ни для подключения к удаленной базе данных. Грубо говоря, все кадры в стеке и для точки, в которой был создан текущий поток, должны иметь необходимые разрешения (java.security.AccessController.doPrivileged может использоваться для игры с этим). Есть некоторые опции отладки, которые можно установить через системные свойства для отображения проверок безопасности (см. Источник в AccessController или около него).

Я не уверен, где вы пытаетесь установить соединение. Если это из кода, динамически загружаемого RMI, это странная вещь.

Вы можете получить полную трассировку стека из исключения с exc.printStackTrace().

0 голосов
/ 27 ноября 2009

При использовании Class.forName () строка, передаваемая методу, должна содержать класс, который присутствует в вашем пути к классам.

...