Собственная библиотека sqljdbc_auth.dll уже загружена в другой загрузчик классов
У меня есть два Java-приложения, которые необходимо подключиться к базе данных SQL Server с помощью встроенной проверки подлинности Windows.
Первый загружаемый отлично работает, а второй генерирует исключение:
Native Library sqljdbc_auth.dll already loaded in another classloader
Произошла ошибка, когда я поместил sqljdbc_auth.dll в одну из папок:
- C:\WINDOWS\system32\
- C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\
Если я поместил sqljdbc_auth.dll в одну из следующих папок:
- /WEB-INF/lib каталог каждого веб-приложения
- C:\Program Files\Apache Software Foundation\Tomcat 7.0\lib\
Оба приложения генерируют исключение:
Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path
Я использую этот код для загрузки драйвера:
Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;");
Как я могу его решить?
Ответы
Ответ 1
Каждое веб-приложение имеет свой собственный Classloader (изолируя их). Когда вы вызываете метод Class.forName(), существует статический блок, который пытается загрузить общую библиотеку (файл dll), - поэтому ваши веб-приложения пытаются загрузить общую библиотеку, поэтому сообщение об ошибке, когда второе попытки загрузить.
Ящик JDBC, который у вас есть для sqlserver, должен быть перенесен из вложения в ваши войны, в папку tomcat 7.0/lib
и скопируйте файл sqljdbc_auth.dll в папку tomcat/bin - таким образом он будет находиться в родительском загрузчике tomcat и класс будет загружен только один раз.
|----------------------------------|
| sqljdbc*.jar --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|
Ответ 2
Я думаю, что ты на правильном пути.
Для запуска командной строки вы можете легко решить проблему no sqljdbc_auth в java.library.path, установив переменную окружения
CATALINA_OPTS=-Djava.library.path=/path/to/dll
Если вы используете tomcat как услугу, измените параметр Параметры в разделе
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java
включить:
-Djava.library.path=/path/to/dll
Ответ 3
Такая же ошибка возникает в Jasper Studio.
Возможно, это не лучшее решение, но поместите sqljdbc4.jar в C:\Program Files (x86)\TIBCO\Jaspersoft Studio.6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre\lib\ext и sqljdbc_auth.dll в C:\Program Files (x86)\TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre\бен
И он будет работать.