2012-05-17 69 views
17

我有2個需要使用Windows集成認證連接到SQL Server數據庫的java web應用程序。本機庫sqljdbc_auth.dll已在另一個類加載器中加載

加載的第一個工作正常,但第二個引發異常:

  • Native Library sqljdbc_auth.dll already loaded in another classloader 
    

    當我放置在sqljdbc_auth.dll其中一個文件夾上面的錯誤發生C:\ WINDOWS \ SYSTEM32 \

  • C:\ Program Files文件\ Apache軟件基金會\ Tomcat的7.0 \ BIN \

如果我放在sqljdbc_auth.dll在下面的文件夾之一:

  • /WEB-INF/lib中每個Web應用程序的目錄
  • C:\ Program Files文件\ Apache軟件基金會\ 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;"); 

我該如何解決?

回答

26

每個Web應用程序都有自己的Classloader(隔離它們)。當你調用Class.forName()方法時,有一個靜態塊試圖加載共享庫(dll文件) - 所以你的Web應用程序都試圖加載共享庫,因此第二個嘗試加載。

你有SQLSERVER的JDBC罐子應該從你的戰爭被捆綁的移動,到tomcat 7.0/lib文件夾和sqljdbc_auth.dll複製到tomcat/bin文件夾 - 這種方式將在Tomcat的父類加載器和類只會被加載一次。

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

正如我在我的問題中說過的,我試圖把DLL放在tomcat 7.0/lib之前。你的回答之後,我創建了tomcat 7.0/lib * s *並將DLL放在那裏,並且我得到了同樣的錯誤: 無法加載sqljdbc_auth.dll原因: - java.library.path中沒有sqljdbc_auth – Gustavo

+0

I'已經閱讀了鏈接中的Tomcat Classloader: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 但是,似乎Tomcat只加載了.jar文件,而不是.dll文件。 – Gustavo

+1

好的,爲了澄清,你需要將dll放在Tomcat/bin文件夾和Tomcat/lib文件夾中的jdbc ** JAR **文件中(對不起,我在lib上的額外s錯誤,我現在已經糾正) –

1

我認爲你是在正確的軌道上。

對於命令行啓動,你可以很容易地如果您正在運行Tomcat作爲服務設置環境變量

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

解決沒有sqljdbc_auth中的java.library.path問題,更改選項

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

參數包括:

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

感謝您的答案,但前一個解決了該問題。 – Gustavo

0

在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和C:\ Program Files(x86)\ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre中的sqljdbc_auth.dll \ bin

它會工作。

相關問題