WAS Liberty:未针对集成身份验证配置 sqljdbc 驱动程序

WAS Liberty: sqljdbc driver not configured for integrated authentication

我在将 Web 应用程序从 Tomcat 6 迁移到 WAS Liberty 8.5.5.8 时遇到数据库连接问题。

在 WAS Liberty 上我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication

我已将 "sqljdbc4.jar" 放入应用程序 WEB-INF\lib-folder 中。我已尝试将文件 "sqljdbc_auth.dll" 放置在不同的地方,例如应用程序 WEB-INF\lib-folder、WAS Liberty bin 文件夹、WAS Liberty lib 文件夹。但是 none 解决了我的问题。

在 Tomcat 上,我将 "sqljdbc4.jar" 放在 Tomcat lib 文件夹中,将 "sqljdbc_auth.dll" 放在 Tomcat bin 文件夹中,然后它就可以工作了。

我怀疑我将 "sqljdbc_auth.dll" 文件放在了错误的位置,但我不知道该放在哪里。我无法在网上找到任何指定在 WAS Liberty 上放置文件的位置。

首先,我建议您为应用程序使用数据源,而不是原始 JDBC 驱动程序。通过使用数据源(在应用程序服务器上配置时由容器管理),您将受益于应用程序服务器完成的许多固有优化,例如连接池和事务支持。

请注意,DataSource 并非特定于 WAS Liberty,在任何应用程序服务器中,通过使用容器管理的 DataSource 而不是原始 JDBC 驱动程序,您将以较低的开发成本获得更高的性能。


配置数据源:

在 server.xml 中配置 DataSource 和 JDBC 库:

<!-- Enable JDBC and JNDI features (at least) -->
<featureManager>
    <feature>jdbc-4.1</feature>
    <feature>jndi-1.0</feature>
</featureManager>

<dataSource id="MyDataSource" jndiName="jdbc/MyDataSource">
    <jdbcDriver libraryRef="MSJDBCLib"/>
    <properties.microsoft.sqlserver databaseName="SAMPLEDB" serverName="localhost" portNumber="1433"/>
</dataSource>

<library id="MSJDBCLib">
    <fileset dir="C:/path/to/sqljdbc4.jar"/>

    <!-- To have authentication support, add the dll to the library -->
    <fileset dir="C:/path/to/sqljdbc_auth.dll"/>
</library>

参见 IBM 文档:Configuring database connectivity in Liberty

回答您的问题的关键是在您的 <library> 元素中添加指向 auth dll 文件的 <fileset> 元素,如下所示:

<!-- To have authentication support, add the dll to the library -->
<fileset dir="C:/path/to/sqljdbc_auth.dll"/>

要使用数据源:

以前,你可能做过这样的事情:

String connectionURL = "jdbc:sqlserver://localhost:1433;DatabaseName=YourDBName;user=UserName;Password=YourPassword";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(connectionUrl);

使用数据源,您可以注入它们或使用 JNDI 查找它们:

注入:

@Resource(lookup = "jdbc/MyDataSource")
DataSource myDataSource;

...

Connection con = myDataSource.getConnection();

JNDI 查找:

DataSource myDataSource = new InitialContext().lookup("jdbc/MyDataSource");
Connection conn = myDataSource.getConnection();