权威支持: 解决 WebSphere Application Server 与 SQL Server 之间的连接错误

SQL Server® 是一个比较流行的数据库,可与 IBM® WebSphere® Application Server、IBM WebSphere Portal 和 IBM WebSphere Commerce 一同使用。本文将帮助您解决从 WebSphere Application Server 连接到 SQL Server 2008 时经常出现的一些错误。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

David Kenner, WebSphere Application Server L2 Support, IBM

David Kenner 是一位 WebSphere Application Server L2 Support 代表。他在 WebSphere Application Server、Portal、Commerce 和 AIX 环境中工作了 10 年时间,其间供职于 IBM 和一家全球最大的零售商。他目前效力于 WASCET 团队,该团队处理 Application Server 的数据库问题,他每天都和 DB2 Support 打交道。他拥有 Application Server 和 DB2 认证。



Dr. Mahesh Rathi, WebSphere Application Server SWAT 团队, IBM

Mahesh Rathi 博士自从 WebSphere Application Server 问世以来就一直从事 WebSphere Application Server 产品方面的工作。在加入 L2 Support 团队之前,他领导安全开发团队,并于 2005 年加入了 SWAT 团队。他全身心投入与苛刻的客户就热点问题进行的合作,并在压力环境中保持旺盛的精力。他从普渡大学获得了计算机科学博士学位,在加入 IBM 之前,他在威奇托州立大学从事软件工程教学。



2011 年 1 月 27 日

在每一篇专栏文章中,权威支持均会对可用于 WebSphere ® 产品的资源、工具以及其他 IBM® Technical Support 元素进行讨论,讨论主题还将包括可进一步增强 IBM 支持和体验的新技术和新概念。

最新快报

按照惯例,我们将首先介绍整个 WebSphere 社区都会感兴趣的新项目:

继续关注 与支持相关的各个网站 以及本专栏,了解我们所遇到的其他工具的相关新闻。

现在,让我们言归正传......


实现一个干净的连接

SQL Server 是 Microsoft® 的企业级关系数据库,是一个比较流行的数据库,可与 IBM WebSphere Application Server、IBM WebSphere Portal 和 IBM WebSphere Commerce 一同使用。如果您正在使用 SQL Server 与 WebSphere Application Server,那么您可能会熟悉下面这个从 WebSphere Application Server 连接到 SQL Server 2008 时经常出现的错误:

DSRA0010E: SQL State = S0001, Error Code = 18,456

DSRA0010E 错误表示 WebSphere Application Server 正在报告一个数据库错误。这个错误中的错误码 18456 表示它必须处理一个失败的登录。要修复数据库中的这个问题,您需要理解可能的原因和解决方案。

使用 WebSphere Application Server 时,这个问题可能由以下几个原因导致:

  • 没有使用 SQL Server 身份验证。
  • 没有使用登录名或使用了错误的登录名。
  • 没有使用密码,或者使用了错误或过期的密码。

更正这个问题需要 WebSphere Application Server 管理员与 SQL Server 数据库管理员(DBA)协作。这个错误同时记录在 WebSphere Application Server SystemOut.log 文件和 SQL Server 2008 的日志文件中。

在详细讨论上述三个原因之前,我们首先了解一些背景知识,以便更好地理解这种错误发生的原因。


联用 WebSphere Application Server 和 SQL Server

在 WebSphere Application Server 中,登录名称为 User ID。SQL Server 2008 和 WebSphere Application Server 在允许的登录名(User ID)和密码方面存在区别。表 1 显示了这些区别。

表 1. 登录名
登录名SQL Server 2008WebSphere Application Server
没有登录名也没有密码不允许允许
有登录名但没有密码允许不允许
登录名和密码允许允许

SQL Server 2008 和 WebSphere Application Server 都建议同时使用登录名(User ID)和密码,以便实现更好的安全性。在 WebSphere Application Server 中,User ID 存储为 J2C 身份验证别名。图 1 展示了一个示例,其中 User ID 是 sqlserveruser,保存为别名 db1wasNode01/SAMPLE。

图 1. J2C 身份验证别名
图 1. J2C 身份验证别名

WebSphere Application Server Information Center 介绍了创建 J2C 身份验证别名的流程。

然后您需要将上述别名应用于您的数据源。为此,选择 Resources > JDBC > Data sources > $DATASOURCE_NAME > Security settings,导航到您的 WebSphere Application Server 管理控制台(见图 2)。单击 OK,然后单击 Save 直接保存到主配置。

图 2. 数据源安全性设置
图 2. 数据源安全性设置

注意,IBM 建议使用组件管理和容器管理的身份验证别名。要了解更多关于设置 SQL Server 2008 数据源的信息,请参阅 WebSphere Application Server V7 Administration and Configuration Guide

现在,我们检查上述三个问题,看看如何在 SQL Server 2008 中解决它们。


没有使用 SQL Server 身份验证

如果没有针对 SQL Server 身份验证而设置 SQL Server 2008 登录名,那么您将在 SystemOut.log 文件中看到清单 1 所示的错误:

清单 1
[9/8/10 17:37:35:953 CDT] 00000016 DSConfigurati W   DSRA8201W: DataSource 
Configuration: DSRA8040I: Failed to connect to the DataSource.  Encountered 
java.sql.SQLException: Login failed for user 'sqlserveruser'.DSRA0010E: SQL State = 
S0001, Error Code = 18,456.
java.sql.SQLException: Login failed for user 'sqlserveruser '.DSRA0010E: SQL State = 
S0001, Error Code = 18,456
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError
(SQLServerException.java:196)
	at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246)
	at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:83)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon
(SQLServerConnection.java:2532)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon
(SQLServerConnection.java:1929)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000
(SQLServerConnection.java:41)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute
(SQLServerConnection.java:1917)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand
(SQLServerConnection.java:1416)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper
(SQLServerConnection.java:1061)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login
(SQLServerConnection.java:833)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect
(SQLServerConnection.java:716)
	at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnectionInternal
(SQLServerDataSource.java:577)
	at com.microsoft.sqlserver.jdbc.SQLServerPooledConnection.createNewConnection
(SQLServerPooledConnection.java:60)
	at com.microsoft.sqlserver.jdbc.SQLServerPooledConnection.<init>
(SQLServerPooledConnection.java:42)
	at com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource.
getPooledConnection(SQLServerConnectionPoolDataSource.java:34)
	at com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource.
getPooledConnection(SQLServerConnectionPoolDataSource.java:24)
	at com.ibm.ws.rsadapter.DSConfigurationHelper$2.run
	(DSConfigurationHelper.java:1633)

SystemOut.log 文件告诉您,登录名 sqlserveruser 有一个问题。要详细了解 SQL Server 2008 为何无法让 sqlserveruser 登录,可以检查 SQL Server 2008 上的日志文件。您的 SQL Server 2008 DBA 将需要启动 Microsoft SQL Server Management Studio,并展开 Management > SQL Server Logs,如图 3 所示。

图 3. SQL Server 日志
图 3. SQL Server 日志

现在,使用来自 WebSphere Application Server SystemOut.log 文件的时间戳,比如 9/8/10 17:37:35:953 CDT,可以搜索 SQL Server 2008 日志并找到对应的日志文件条目(见图 4)。

图 4. Log File Viewer
图 4. Log File Viewer

注意,SQL Server 告诉您用户 sqlserveruser 登录失败的原因:它只针对 Windows® 身份验证进行了配置。这个错误需要在 SQL Server 2008 上更正。但是,如果已经创建了一个登录名来使用 Windows 身份验证,就不能将其修改为使用 SQL Server 身份验证,反之亦然(见图 5)。

图 5. 一个 SQL Server 用户的登录属性
图 5. 一个 SQL Server 用户的登录属性

DBA 需要删除并重建相同的登录名,或者创建一个新的登录名。要创建一个新的登录名,WebSphere Application Server 要求新的登录拥有:

  • SQL Server 身份验证。
  • 一个密码。
  • 一组成员,拥有足够的授权来发出 TRUNCATE TABLE 语句且拥有 CREATE TABLE 语句权限。
  • 连接到数据库的权限。

图 6 展示了如何创建一个 SQL Server 2008 登录名。在 Microsoft SQL Server Management Studio 中,展开 Security > Logins,右键单击 Logins,然后选择 New Login

图 6. 创建新登录
图 6. 创建新登录

输入 Login name。您将注意到,默认值是 Windows authentication。将其更改为 SQL Server authentication,然后输入 Password 两次(见图 7)。

图 7. 输入登录参数
图 7. 输入登录参数

选择 User Mapping 页面,映射到需要连接到的数据库;在本例中,使用的是 SAMPLE 数据库(见图 8)。单击 OK 保存。

图 8. 定义用户映射
图 8. 定义用户映射

没有使用登录名或使用了错误的登录名

如前所述,SQL Server 2008 登录需要一个登录名,但不需要密码(见图 9)。

图 9. 连接到 SQL Server 需要的登录名
图 9. 连接到 SQL Server 需要的登录名

但是,当您试图从 WebSphere Application Server 连接到 SQL Server 2008 而又没有登录名(User ID)时,将得到一个错误:

清单 2
[10/27/10 12:38:14:441 CDT] 00000016 DSConfigurati W   DSRA8201W: DataSource 
Configuration: DSRA8040I: Failed to connect to the DataSource.  Encountered 
java.sql.SQLException: Login failed for user ''.DSRA0010E: SQL State = S0001, 
Error Code = 18,456.

注意,登录失败的原因是 user ''(换句话说,没有指定登录名)。参阅上一节了解创建登录名的细节。

如果使用错误的登录名,将得到以下错误:

清单 3
[10/28/10 11:23:24:097 CDT] 00000014 DSConfigurati W   DSRA8201W: DataSource 
Configuration: DSRA8040I: Failed to connect to the DataSource.  Encountered 
java.sql.SQLException: Login failed for user 'sqlserver'.DSRA0010E: SQL State = S0001, 
Error Code = 18,456.

WebSphere Application Server 指出登录名 sqlserver 有一个问题。如前所示,您需要检查 SQL Server 2008 上的日志文件,找到详细信息。图 10 显示了标明错误 18456 的 Log File Viewer 屏幕。

图 10. 显示错误 18456 的 Log File Viewer
图 10. 显示错误 18456 的 Log File Viewer

注意,sqlserver 登录名不能在 SQL Server 2008 中找到。在本例中,正确的登录名是 sqlserveruser。它还提供了一个 State number:State 5,这表示 User ID 无效。参见表 2 了解关于 States 的更多信息。


没有使用密码,或者使用了错误或过期的密码

使用登录名时,您需要一个密码。提供错误密码会导致以下错误:

清单 4
[10/27/10 17:07:55:593 CDT] 00000016 DSConfigurati W   DSRA8201W: DataSource 
Configuration: DSRA8040I: Failed to connect to the DataSource.  Encountered 
java.sql.SQLException: Login failed for user 'sqlserveruser'.DSRA0010E: SQL State 
= S0001, Error Code = 18,456.

与上一个示例一样,您需要检查 SQL Server 上的日志文件,了解 sqlserveruser 登录失败的具体原因(见图 11)。

图 11. Error 18456, State 8
图 11. Error 18456, State 8

注意,在 SQL Server 2008 日志中,报告的问题是密码不匹配。它还提供了一个 State number:State 8,这表示密码错误(见表 2)。


其他可能的原因

如 State 所示,Error Code = 18456 还有许多其他原因。

表 2. 状态说明
状态说明
2User ID 无效
5User ID 无效
6企图将 Windows 登录名用于 SQL Server 身份验证
7登录禁用,密码错误
8密码错误
9密码无效
11登录有效,但服务器访问失败
12登录有效,但服务器访问失败
13登录试图访问暂停服务的 SQL Server
16在默认数据库不可用时登录
18密码必须更改
23密码必须更改
38当 DEFAULT 数据库在服务器上不可用时登录
40当数据库离线或不可用时登录

结束语

本文描述了从 WebSphere Application Server 连接到 SQL Server 2008 时经常出现的一些错误,可能的原因,以及帮助您解决这类错误的步骤。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=619803
ArticleTitle=权威支持: 解决 WebSphere Application Server 与 SQL Server 之间的连接错误
publish-date=01272011