数据访问问题
WebSphere® Application Server 诊断工具提供了一些服务来帮助对数据库连接问题进行故障诊断。另外,IBM® Web 站点提供了灵活的搜索功能,用于查找特定于数据库的连接问题的已记录的解决方案。
以下步骤帮助您快速找出连接问题所在。
- 浏览此应用程序服务器的日志文件以获取线索。
请参阅“设置错误日志”主题。
请参阅“查看 JVM 日志”主题。缺省情况下,这些文件是 app_server_root/server_name/SystemErr.log 和 SystemOut.log。
注: 本主题引用了一个或多个应用程序服务器日志文件。作为另一种建议采用的方法,您可以在分布式系统和 IBM i 系统上配置服务器以使用高性能可扩展日志记录 (HPEL) 记录和跟踪基础结构,而不使用 SystemOut.log、SystemErr.log、trace.log 和 activity.log 文件。您还可以将 HPEL 与本机 z/OS 日志记录设施结合使用。如果要使用 HPEL,那么可从服务器概要文件 bin 目录使用 LogViewer 命令行工具来访问所有日志和跟踪信息。有关使用 HPEL 的更多信息,请参阅有关使用 HPEL 对应用程序进行故障诊断的信息。 - 浏览数据源的 Helper 类属性以验证它是否正确且是否位于 WebSphere Application Server 类路径中。很难理解的错误或行为可能是缺少 helper 类名或该类名命名错误所致。如果 WebSphere Application Server 无法装入指定的类,那么它将使用可能无法在数据库管理器中正常工作的缺省 helper 类。
- 验证数据源的 Java™ 命名和目录接口 (JNDI) 名是否与尝试访问该数据源的客户机所使用的名称相匹配。如果错误消息表明问题可能与命名相关,例如引用了名称服务器或命名服务,或者包含以 NMSV 开头的错误标识,请参阅“与命名相关的问题”和“对命名服务组件进行故障诊断”主题。
- 使用跟踪规范 RRA=all=enabled 为资源适配器启用跟踪。遵循转储及浏览跟踪输出的指示信息以缩小问题起因的范围。请参阅“启用跟踪”主题。
有关特定于数据库的故障诊断技巧的完整列表,请参阅 WebSphere Application Server 产品支持页面。(在本文章末尾可以找到相应的链接。)在 Search Support 字段中,在搜索项中输入数据库供应商名称。选择 Solve a problem,然后单击 Search。
请记住,始终都可以在此信息中心的“IBM 提供的故障诊断帮助”主题中找到 Support 引用。
目前,此信息中心对下列数据库提供的故障诊断技巧数目有限:
一般数据访问问题
- 发生异常“IllegalConnectionUseException”
- WTRN0062E: 发生登记多个支持一阶段的资源的非法尝试。
- ConnectionWaitTimeoutException。
- com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N 无法找到数据库别名或数据库名称“NULL”。SQLSTATE=42705
- java.sql.SQLException: java.lang.UnsatisfiedLinkError:
- 当尝试执行事务时,“J2CA0030E: 方法 enlist 捕获 java.lang.IllegalStateException”包含在错误“WTRN0063E:已发生将支持一阶段的资源与现有支持两阶段的资源并列的非法尝试”。
- 尝试执行数据库操作时发生 java.lang.UnsatisfiedLinkError:xaConnect 异常
- 尝试执行数据库操作时发生“J2CA0114W: 对于连接工厂或数据源 datasource,找不到容器管理的认证别名”
- 当您使用 ws_ant 命令在 HP 平台上执行 Java 结构化查询语言的数据库定制时抛出一个错误
- 容器管理的持久性 (CMP) 无法按照定义成功获取数据库访问功能
IllegalConnectionUseException
发生此错误的原因是从 WAS40DataSource 获取的连接正用于多个线程。此用法违背了 J2EE 1.3 编程模型,并且在服务器上检测它时生成异常。用户通过 servlet 或 bean 管理的持久性 (BMP) 企业 Bean 访问数据源时会发生此问题。
要确认此问题,请检查连接共享的代码。如果不遵循编程模型建议,那么代码会无意中导致共享,例如,通过 在 servlet 的实例变量中存储连接,会导致在多个线程上同时使用该连接。
WTRN0062E: 发生登记多个支持一阶段的资源的非法尝试
- 已尝试共享一阶段连接,但并非所有 getConnection 调用都使用相同的连接属性;例如 AccessIntent 属性。
- 当数据源不是 XA 资源时,尝试使多个不可共享的连接参与到全局事务中。
- 在一个 XA 资源或一阶段资源参与全局事务后,尝试使另一个一阶段资源参与此全局事务。以下信息可以帮助您确定此错误情况的发生原因:
- 如果您使用的是非 XA 数据源,并且期望共享连接,请将所有相关资源引用设置为可共享。如果未使用资源引用,那么缺省值将设置为不可共享的连接。
- 如果并非所有连接请求都使用相同的连接属性(例如 IsolationLevel 或 AccessIntent),那么将不会共享连接。
- 如果您使用的是可能使用了不同 AccessIntent 设置的 CMP Bean,那么可能无法共享连接。要了解与非 CMP 组件共享连接的 CMP Bean 的更多信息,请参阅有关数据访问 API 扩展的信息。
- 检查客户机代码随其 getConnection 请求一起传递的内容,以确保这些请求相互一致。
- 使用组装工具从资源绑定检查连接共享范围。请参阅“组装工具”主题。
- 如果正在运行不可共享的连接范围,那么验证数据源是否为 XA 数据源。
- 如果正在运行可共享的连接范围,请验证是否所有连接属性(包括 AccessIntent)都可共享。
- 从管理控制台的“管理 JDBC 资源”面板中检查 JDBC 提供程序实现类,以确保它是支持 XA 类型事务 的类。
访问数据源或资源适配器时,发生 ConnectionWaitTimeoutException
- 给定池的最大连接数设置得太小。对连接的并发使用需求超出对连接池配置的最大值。此情况是一个问题的表现是:定期地接收到这些异常,但是 CPU 使用率并不高。此异常表明,可用的连接太少以致无法使服务器中的线程保持忙碌状态。
- 连接等待时间设置得太短。Current®当前连接需求过高,以至于有时会暂时没有可用的连接。如果连接等待超时值太短,那么用户将连接返回到池之前,可能会短时间超时。调整连接等待时间会使您轻松一点。此问题的一个表现是:在扩展的周期使用的连接数接近最大连接数且定期接收到此错误。
- 您未关闭某些连接,或者正在以非常低的速度将连接返回到池中。在使用不可共享的连接、忘记关闭连接或者在结束使用连接之后很长时间才将其关闭,从而导致连接无法返回到池中以供复用时,可能会发生这种情况。该池很快成为空池,并且所有的应用程序将收到 ConnectionWaitTimeoutExceptions。此问题的一个表现是:用完了连接池中的连接且在大多数请求时接收到此错误。
- 正在驱动比服务器更多的负载,或者后端系统具有要处理的资源。在这种情况下,必须确定需要哪些更多资源并升级配置或硬件以处理该需要。此问题的一个表现是:应用程序服务器或数据库服务器的处理器繁忙程度接近 100%。
- 修改应用程序以使用较少的连接
- 正确地关闭连接。
- 更改 MaxConnections 或 ConnnectionWaitTimeout 的池设置。
- 调整资源及其配置。
com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N 找不到数据库别名或者数据库名称“NULL”
com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N 找不到数据库别名或者数据库名称“NULL”。SQLSTATE=42705。当定义了数据源但未将 databaseName 属性和相应的值添加到定制属性面板时,会发 生此错误。
- 在管理控制台中,单击 。
- 选择向发生问题的数据源提供支持的 JDBC_provider。
- 选择数据源,然后选择问题数据源。
- 在其他属性下面,单击定制属性。
- 选择 databaseName 属性,如果它不存在,那么添加一个,然后输入实际数据库名称作为值。
- 单击应用或确定,然后单击操作栏中的保存。
- 再次访问数据源。
java.sql.SQLException: java.lang.UnsatisfiedLinkError
此错误表明,在 WebSphere Application Server 启动环境的 LIBPATH 环境变量中,不包括包含二进制库 (支持数据库)的目录。
包含 DBM 供应商库的路径随 dbm 的不同而有所变化。查找它们的一种方法 是搜索错误消息中指定的缺少库。然后,您可以通过以下两种方法更正 LIBPATH 变量以使其包括缺少的目录:在启动 WebSphere Application Server 的帐户的 .profile 中进行更正,或者在随后用于启动 startServer 程序的 .sh 文件中添加语句进行更正。
使用 domain_region_libpath 环境变量(例如 control_region_libpath、server_region_libpath 或
adjunct_region_libpath)来配置 Java LIBPATH (java.library.path) 属性。请参阅有关更改 BBOM0001I 消息中所引用变量的值的主题,获取有关如何设置 region libpath 变量的指示信息。
包装在错误 WTRN0063E 中的错误 J2CA0030E
尝试执行事务时,在“WTRN0063E: 已发生将支持一阶段的资源与支持两阶段的现有资源并列的非法尝试”错误中包装了“J2CA0030E: 方法 enlist 捕获到 java.lang.IllegalStateException”。如果缺少或禁用最后参与者支持,那么会发生此错误。最后参与者支持允许支持一阶段的资源与支持两阶段的资源在同一事务中并列。
- 已安装 WebSphere Application Server 编程模型扩展 (PME)。PME 包含在 Application Server Integration 服务器产品中。
- 安装 PME 时启用了“其他 Integration 服务器扩展”选项。如果执行典型安装,那么缺省情况下将启用此功能。如果执行定制安装,那么可以禁用此功能,这将禁用最后参与者支持。
- 登记一阶段资源的应用程序是在启用接受试探风险选项的情况下进行部署的。此部署是使用组装工具完成的。
尝试执行数据库操作时发生 java.lang.UnsatisfiedLinkError:xaConnect 异常
- 最常见的原因是缺少支持连接到数据库的 JDBC 驱动程序,或者该驱动程序的版本不正确。另一个常见原因是,支持该驱动程序的本机库不在系统路径中。
- 要在 Windows 平台上解决此问题,请验证 JDBC 驱动程序 JAR 文件是否在系统 PATH 环境变量中:
- 如果在使用 DB2,请验证在 WebSphere 主机上是否至少已安装了 DB2 客户机产品
- 在 DB2 V7.2 或更低版本上,WebSphere Application Server 上安装的客户机产品的文件是 db2java.zip。验证安装数据库和升级数据库产品后,是否已执行 usejdbc2.bat 程序。
- 在 DB2 V8.1 或更高版本上,WebSphere Application Server 中定义 JDBC 提供程序时,请使用 DB2 通用 JDBC 提供程序驱动程序。驱动程序文件是 db2jcc.jar。如果使用“类型 2”(缺省)选项,请验证在 WebSphere Application Server 主机上是否至少安装了 DB2 客户机产品。如果指定“类型 4”选项,那么不需要安装 DB2 客户机,但文件 db2jcc.jar 仍必须存在。
在指定驱动程序文件的位置时,如果有可能,建议指定目标 DB2 安装的路径及文件名,而不要将该文件复制到本地目录。否则,如果对目标 DB2 安装进行升级而未对 WebSphere Application Server 使用的驱动程序进行升级,那么可能会出现问题。
- 如果在使用 DB2,请验证在 WebSphere 主机上是否至少已安装了 DB2 客户机产品
- 在 AIX® 或 Linux 之类的操作系统上,请确保在用于启动
WebSphere Application Server 的帐户的概要文件中使用 LD_LIBRARY_PATH
环境变量指定支持数据库产品的数据库客户机所需的所有本机库。
如果使用 DB2,那么本机库为 libdb2jdbc.so。确保 WebSphere 正确访问这个库的最佳方法是,从用于运行 WebSphere 的帐户(例如“root”)的 .profile 脚本中调用 DB2 随附的 db2profile 脚本。
- 如果您使用的是 DB2 V7.2 或更低版本,请确保从用于启动 WebSphere Application Server 的帐户的概要文件中调用 DB2 随附的 usejdbc2 脚本。
- 如果使用 DB2 V8.1 或更高版本,请参阅用于 Windows 操作系统的上述指示信息。
- 要在 Windows 平台上解决此问题,请验证 JDBC 驱动程序 JAR 文件是否在系统 PATH 环境变量中:
- 如果数据库管理器是 DB2,那么您可以选择创建 64 位实例的选项。在某些情况下,不支持
64 位配置。如果发生这种情况,请移除该数据库实例并创建具有缺省 32 位设置的实例。
如果使用通用 JDBC T2 驱动程序,那么 WebSphere Application Server 支持与 DB2 UDB 64 位服务器交互,但必须通过 DB2 UDB 32 位客户机。WebSphere Application Server 环境(CLASSPATH 等等)必须使用 32 位客户机代码才能确保正常工作。
对于通用 JDBC T4 驱动程序,不需要 32 位 DB2 客户机。在 WebSphere Application Server 环境中,只需将类路径配置为包括 db2jcc.jar 及其许可证文件。
注: 有关在 WebSphere Application Server 中配置 JDBC 驱动程序和数据源的一般帮助,请参阅“从应用程序访问数据”主题。
尝试执行数据库操作时发生“J2CA0114W: 对于连接工厂或数据源 datasource,找不到容器管理的认证别名”
使用 JACL 脚本创建数据源后,如 果运行应用程序以访问此数据源,那么 SystemOut.log 文件中可能发生此错误。
$AdminConfig create MappingModule $cmpConnectorFactory "{mappingConfigAlias
DefaultPrincipalMapping} {authDataAlias $authDataAlias}
要解决此问题,请将缺少的行添加到 JACL 脚本并再次运行此脚本。请参阅“示例:使用 Java 管理扩展 API 和脚本编制工具创建 JDBC 提供程序和数据源”主题,以获取样本 JACL 脚本。
在 HP 平台上使用 ws_ant 命令为 SQLJ 执行数据库定制时发生错误
[java] [ibm][db2][jcc][sqlj]
[java] [ibm][db2][jcc][sqlj] Begin customization
[java] [ibm][db2][jcc][sqlj] encoding not supported!!
此错误的原因可能是数据库是使用 HP 缺省字符集创建的。Java
公共客户机 (JCC) 驱动程序依靠软件开发包 (SDK) 执行代码页转换。但是,本产品随附的 SDK 不支持 HP 缺省代码页。export LANG=en_US.iso88591
请参阅信息管理软件的 IBM 支持站点,以访问有关 DB2 的最新技术说明。容器管理的持久性 (CMP) 无法按照定义成功获取数据库访问功能
如果 WebSphere Application Server 正在高速缓存在连接工厂的数据库中访问的某些生成的代码,并且 Java 归档 (JAR) 文件中的任何更改要求重新生成数据库访问,那么只有停止并重新启动服务器,这些更改才会生效。
- 添加企业 Bean 定制 finder 方法;将会产生 NullPointerException 异常。
- 更新企业 Bean 定制 finder 方法;新的 SQL 语句不能运行。
- 更改模式映射;新的 SQL 语句不能运行。
总之,如果添加或更新包含定制 finder 方法的企业 Bean,就必须停止服务器然后重新启动 它。