Собственная библиотека sqljdbc_auth.dll уже загружена в другой загрузчик классов

У меня есть 2 веб-приложения 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;");

Как я могу решить это?

3 ответа

Решение

Каждое веб-приложение имеет свой собственный Classloader (изолирующий их). Когда вы вызываете метод Class.forName(), появляется статический блок, который пытается загрузить общую библиотеку (файл dll) - поэтому оба ваших веб-приложения пытаются загрузить общую библиотеку, поэтому появляется сообщение об ошибке, когда второй пытается загрузить.

Jar-файл JDBC, который у вас есть для sqlserver, должен быть перенесен из комплекта ваших войн в tomcat 7.0/lib и скопируйте файл sqljdbc_auth.dll в папку tomcat / bin - таким образом, он будет находиться в родительском загрузчике классов tomcat, и класс будет загружен только один раз.

|----------------------------------|
| sqljdbc*.jar     --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|

Я думаю, что вы на правильном пути.

Для запуска командной строки вы можете легко решить проблему no sqljdbc_auth в java.library.path, установив переменную среды

CATALINA_OPTS=-Djava.library.path=/path/to/dll

Если вы запускаете tomcat как сервис, измените параметр Options в

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java

включать:

-Djava.library.path=/path/to/dll

Такая же ошибка возникает в 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\bin

И это будет работать.

Другие вопросы по тегам