级别: 中级 Anju Sudhakar (anjus@us.ibm.com), 质量保证工程师, IBM
2006 年 4 月 07 日 WebSphere® Application Server (Application Server) 是一种高性能的事务服务器,它的特性是具有一个极具可伸缩性的事务引擎,能够处理大量的安全事务和 Web 服务。应用程序服务器是中间件,能够处理企业中用户与后端应用程序和数据库之间的应用程序功能。Informix® Dynamic Server (IDS) 是一个可扩展的对象关系数据库服务器,它支持 SQL、Dynamic SQL、C++ 和 Java™ 语言中的随需应变计算、WebSphere、OLTP 和 OLAP 数据管理应用程序。可以将 IDS 作为 Application Server 的后端资源使用。
安装 Application Server 和 IDS
必须单独安装 IDS 和 Application Server。想获得安装过程的详细说明(包括计划和配置),请参阅 参考资料 部分中的产品文档链接。
安装 WebSphere Application Server
IBM WebSphere Application Server 是一个集成式平台,包含一台应用程序服务器、一组 Web 开发工具、一台 Web 服务器和额外的支持软件和文档。可以使用各种配置在一个或多个系统上安装 WebSphere Application Server。下面的列表包含一些典型的安装场景:
- 在一个系统上安装 WebSphere Application Server
- 在一个系统上安装 WebSphere Application Server 和 Web 服务器
- 在两个系统上安装 WebSphere Application Server 和 Web 服务器
- 创建使用同一个 WebSphere Application Server 安装的多个配置文件
安装 WebSphere Application Server 需要您以管理员组中的一名成员的身份进行登录。安装过程的一些步骤需要使用管理员组 ID,以便充当操作系统的一部分,并作为一项服务进行登录。
WebSphere Launchpad 是安装 WebSphere Application Server 产品的起点。可以使用名为 launchpad.bat 或 launchpad.sh 的程序,从产品 CD 的根目录中启动 launchpad 程序。在启动 launchpad 之后,就可以选择下列组件进行安装:
- WebSphere Application Server
- IBM HTTP Server
- Web Server Plug-in
- Application Client
- Application Server toolkit
安装 Informix Dynamic Server
Informix Dynamic Server for Windows® 中包括 Informix Dynamic Server Launchpad,您可以从中查看文档或版本说明、安装 IDS,或者浏览 CD。
配置
这一节将描述在 WebSphere 中创建用于 IDS 的 JDBC™ 提供程序的步骤,还将描述通过添加和修改数据源 Custom Properties 中的值来配置数据源的步骤。
创建 JDBC 提供程序
可以使用 WebSphere Administrative Console 创建用于 IDS 的 JDBC 提供程序。本文中的两个实现类型是 XA 数据源和 Connection Pool 数据源:
- 对于 XA 数据源 JDBC 提供程序来说,需要将实现类的名称设置为
com.informix.jdbcx.IfxXADataSource。还需要创建下列 CLASSPATH 条目,在这些条目中,${INFORMIX_JDBC_DRIVER_PATH} 是 JDBC 驱动程序的安装路径。在将 SQLJ 与 WebSphere Application Server 结合使用时,会用到 ifxsqlj.jar。
${INFORMIX_JDBC_DRIVER_PATH}/ifxsqlj.jar
${INFORMIX_JDBC_DRIVER_PATH}/ifxjdbc.jar
${INFORMIX_JDBC_DRIVER_PATH}/ifxjdbcx.jar |
- 对于 Connection Pool 数据源来说,需要将实现类的名称设置为
com.informix.jdbcx.IfxConnectionPoolDataSource。还需要创建下列 CLASSPATH 条目:
${INFORMIX_JDBC_DRIVER_PATH}/ifxjdbc.jar
${INFORMIX_JDBC_DRIVER_PATH}/ifxjdbcx.jar |
在 Application Server 中设置 Informix 环境变量
上一节介绍了两个 JDBC 提供程序,您可以在任意一个提供程序下面创建数据源,具体的使用取决于应用程序的需求。在创建数据源之后,可以使用 Application Server Administrative Console 中的 Custom Property 链接来添加或修改 Informix Dynamic Server 所需的环境参数。可以通过选择 Resource -> JDBC Provider -> JDBC provider Name(XA 或 Connection Pool)-> Data source name used by the application 来可导航到 Custom Properties 链接。
还可以使用 Custom Properties 下的 New 按钮添加 Informix Dynamic Server 所需的环境参数。要修改现有参数,请单击所需参数并键入新值。然后单击 Apply 立即在本地配置进行更改。单击页首的 Save(在消息对话框中)来保存对主配置的修改。为了使这些修改生效,可能需要重启 Application Server。
故障诊断
这一节将介绍一些常见问题和它们的解决方案。还将介绍使用 IDS 和 Application Server 时可能遇到的一些 XA 事务问题和常见错误。
XA 事务问题
这两类问题有一个通用的解决方案。
- 现象:由于紧密耦合事务在 IDS 中不受支持而导致抛出 SQL Exceptions。
当紧密耦合事务在 IDS 中不受支持时,您可能会收到下列异常之一:
- java.sql.SQLException: ISAM error: The record is locked.
- java.sql.SQLException: Could not do a physical-order read to fetch next row.
ISAM 消息略微有些不同,主要取决于是否设置了 SET LOCK MODE TO WAIT [seconds]。如果设置成 SET LOCK MODE NOT WAIT,那么消息是 ISAM error: record is locked。如果设置成 SET LOCK MODE TO WAIT [seconds],则会在应用程序等待超时抛出异常 ISAM error: Lock Timeout Expired。
- 现象:在 Application Server 的 SystemOut.log 中出现错误消息 “Could not do a physical-order read to fetch next row”。
当多个用户或多台客户机同时访问正执行 XA 事务的同一个 Informix 数据库时,可能在 Application Server 文件 SystemOut.log 中得到以下错误:
Caused by: java.sql.SQLException: Could not do a physical-order read to fetch next row.
DSRA0010E: SQL State = IX000, Error Code = -244
at com.informix.jdbc.IfxSqli.a (IfxSqli.java (Compiled Code))
at com.informix.jdbc.IfxSqli.E (IfxSqli.java(Compiled Code))
|
解决方案:您可能需要调整 IDS 并设置 Application Server 自定义属性中的某些 Informix 环境变量。需要设置下列 Informix 配置参数:
DISABLE_B162428_XA_FIX:
- 0(默认值):只在调用 XA 回滚时释放事务。
- 1:如果是除 XA 回滚以外的其他事务回滚,则释放事务。当数据库服务器关闭并重启后生效。
根据 XA/Open 规范,如果事务是通过服务器进行回滚,而不是一个通过客户机进行的 XA 回滚,则 XID 不被忽略,且事务处于只回滚 (rollback only ) 状态。这是 Informix Dynamic Server Version 10.0 的默认行为。想返回到以前的行为,请在 IDS 中设置下列 ONCONFIG 参数:
将 DISABLE_B162428_XA_FIX 设置为 1,在一个事务回滚之后立即释放所有全局事务,这是 Dynamic Server V9.40 和更早的版本中的默认行为。Dynamic Server 10.0 的默认行为是在调用 xa_rollback 之后释放全局事务,并且此行为需要与 XA 状态表一致,确保只在调用 xa_rollback 之后释放事务。将 DISABLE_B162428_XA_FIX 设置为 1,确保为 Dynamic 服务器的早期版本编写的应用程序可以正常工作。
对于 Informix Dynamic Server Version 9.40,ONCONFIG 参数 ENABLE_B162428_XA_FIX 被设置为 1,以确保此行为是 XA_SPEC+ 兼容的行为。
可以重写服务器的 DISABLE_B162428_XA_FIX 配置参数,获得带有 IFX_XASTDCOMPLIANCE_XAEND 环境变量的客户机会话。当通过 ONCONFIG 参数禁止服务器实例获得新行为,但某一客户机需要新行为时,该环境变量就特别有用。返回 XA_RB* 时的 XA_END 的行为是通过 IFX_XASTDCOMPLIANCE_XAEND 的设置来指定的,它可以采用下列值:
IFX_XASTDCOMPLIANCE_XAEND
- 1:不忽略 XID。事务处于 Rollback-only 状态。此行为是 XA_SPEC+ 兼容的,并且是 IDS 10.0 的默认行为。
- 0:忽略 XID。事务处于 Nonexistent 状态。这是 IDS V9.40 的默认行为。
必须在 Application Server 自定义属性中设置下列特定于 Informix 的环境变量:
- 设置
IFX_XASPEC 变量。
激活此变量,增强同一个全局事务 ID 中的 XA 事务的紧密耦合,并允许这些事务共享锁定空间。IFX_XASPEC 仅适用于 XA 连接,不能在数据库 URL 中指定,但可以通过数据源指定它,或者通过使用相同名称设置(JVM 的)系统属性来指定。数据源属性重写了系统属性。忽略除 y、 Y、 n 或 N 以外的任何属性的值。IfxDataSource.getIfxIFX_XASPEC 返回最终的 IFX_SPEC 值,这个值不是 y 就是 n。例如,如果数据源 IFX_XASPEC 的值等于 n,并且系统 IFX_XASPEC 的值等于 Y 或 y,则返回 n。
如何在 Application Server 自定义属性中设置此属性:
- 登录到 Application Server Administrative Console。
- 创建用于 Informix XA 数据源的新的自定义属性 ifxIFX_XASPEC;将它设置为 Y 或 y。该值不是一个 Boolean 值,并且该属性的设置覆盖了数据库系统设置。
可以尝试执行下列调优步骤:
- 对数据库运行命令 UPDATE STATISTICS HIGH。此命令更新了系统目录中的统计数据,优化程序使用这些数据来确定成本最低的查询计划。
- 如果许多事务将更新一些单独的行,则使用下列 SQL 语句将特定表更改为 row locking 模式:
ALTER TABLE [table name] LOCK MODE (ROW) |
- 为应用程序将查询或更新的列创建索引。
带有更新的软件:
- Informix Dynamic Server, Version 9.40.UC6
- Informix Dynamic Server, Version 10.00.UC1
- 3.00. JC1 JDBC 驱动程序
- 现象:会话中的 Informix 事务隔离设置没有在 XA 全局事务中得到传播。
您可能看到下列异常信息:
A SQLException "Could not position within a table" with a nested
SQLException "Lock Timeout Expired" thrown. |
出现这个异常的原因是,在 XA 事务终止时,IDS 把事务隔离设置重置为数据库默认设置。更改发生在数据库上,所以 WebSphere 不知道已经发生了更改,而且在下一次从池中检索连接时可能无法重置事务隔离级别。这会导致连接和 IDS 不同步。
在重置事务隔离设置时,具体情况会因为 Informix 数据库日志记录类型的不同而有所不同:
同 IDS 日志类型不同的事务隔离默认
| 日志类型 | 默认的事务隔离 |
|---|
| 没有事务日志的数据库 | 读操作未提交 | | 带有与 ANSI 不兼容的日志的数据库 | 读操作未提交 | | 带有与 ANSI 兼容的日志的数据库 | 可序列化 |
如果试图使用 READ_UNCOMMITTED 默认值来读取 WebSphere 调度程序服务中的事务隔离,那么将会阻塞所有调度程序读取操作,并且会接收到锁定超时 SQLException 异常,这是由于长时间运行作为读取操作一部分的某些任务导致的。
解决方案:为了在 Informix Dynamic Server 中启用紧密耦合的 XA 事务,请按照 故障现象:在 Informix Dynamic Server 中启用紧密耦合的 XA 事务 中的解决方案进行。经过这样的修复后,隔离级别的值和锁定模式都是完全连接级 (complete-connection level) 设置。完全连接级设置允许将本地环境中设置的值传播到所有事务。如果事务内的值发生更改,则将更改的值传播回本地环境和所有后续(新的和恢复的)事务。
带有修复的软件:
- 9.40. UC7W1 and later versions of Informix Dynamic Server
- 10.00. UC3W4 and later versions of Informix Dynamic Server
- 3.00. JC3 JDBC driver
其他问题
- 现象:Application Server 的 SystemOut.log 中的消息 “Null Pointer Exception on BLOB/SMARTBLOB column”
当使用串行化的对象创建 IfxBblob 或 IfxCblob 并将它们发送到服务器时,会返回一个空指针异常。
解决方案:不使用 IfxBblob (inputStream)、IfxCblob (inputStream)、IfxCblob (inputStream) 或 IfxCblob (locator) 访问服务器,只在 MODE_CLIENT_ONLY 模式下运行。
- 现象:由于 Informix JDBC Driver 3.00JC1 中存在一个问题而导致 Application Server 的消息传递引擎无法启动。
当消息传递引擎使用 Informix JDBC 驱动程序 3.00JC1 来存储其数据时,消息传递引擎无法启动。可以在应用服务器文件 SystemOut.log 中找到下列消息:
[…..] CWSIS0002E: The messaging engine encountered an exception while starting.
Exception: com.ibm.ws.sib.msgstore.PersistenceException: CWSIS1501E:
The dataSource has produced an unexpected exception: java.sql.BatchUpdateException:
Unique Constraint (informix.u114_62) violated. |
解决方案:把 Informix JDBC Driver 升级到 3.00JC2
- 现象:当试图访问 EJB™ 组件生成的模块时,在 WAS 文件 SystemOut.log 中出现 ApplicationNotFindException。
当一个实体 (CMP) 从表中获取字符串,并将空格插入到结果集合中时,可能导致错误 ApplicationNotFindException。
例如:
可以在 Informix 数据库中存储一个失败事件,事件的 Destination_module_name 是 HelloWorldWithBO(16 个字符)。要想获得失败事件的细节信息,可以调用 FailedEventManagerEJBBean.getFailedEventWithParameters,它执行下列代码:
loadClassContext (fel.getDestination_module_name ());
fel.getDestination_module_name () returns:
"HelloWorldWithBO " (255 characters),
instead of "HelloWorldWithBO" (16 characters).
|
因此无法找到模块,并将抛出 ApplicationNotFindException。
解决方案:由 EJB 组件生成的模式 DDL 在默认情况下对列使用的数据类型是 CHARACTER。在上面的例子中,Destination_Module_Name 被定义为 CHARACTER (255)。
使用数据类型 VARCHAR 或 LVARCHAR,而不是 CHAR。
- CHAR 存储固定长度的单字节或多字节的文本字符串(最高可达 32,767 个字节);在整理文本数据时支持使用代码集顺序。默认大小是 1 个字节。
- VARCHAR 存储可变长度的单字节或多字节文本字符串(最高可达 255 个字节);在整理文本数据时支持使用代码集顺序。
- LVARCHAR (IDS) 存储可变长度的单字节或多字节文本字符串(最高可达 32,739 个字节)。同一个表中其他列的大小可以进一步减少这个上限。默认大小是 2,048 个字节。
- 现象:在本地安装 Informix Dynamic Server 时无法连接到本地主机
在使用 Application Server 本地安装 IDS 时,使用本地主机时无法连接到 IDS。在 Application Server 中配置数据源时也可能发现同样的问题。
解决方案:
- 在 Windows 操作系统上,在 setnet32 的主机信息选项卡中使用
*[hostname] 来获取 IP 地址 127.0.0.1 和用来连接 Informix 的本地主机。
- 在 Solaris Operating Environment 上,使用 ONCONFIG 参数 DATABASESERVERALIASES 来解决本地主机问题。
例如:在 IDS ONCONFIG 文件中将 DATABASESERVERALIASES 设置为 patriot1_local,并把下列行添加到
$INFORMIXSQLHOSTS ($INFORMIXDIR/etc/sqlhosts):
patriot1_local ontlitcp 127.0.0.1 18551 |
- 现象:Informix 2.21.JCX JDBC 驱动程序返回错误的 holdability 值
Informix 2.21.JCX JDBC 驱动程序返回错误的 holdability 值。它是 Application Server V6.0 所需要的。
解决方案:该修改可以在 Informix JDBC 驱动程序的较新版本中找到。请使用 3.00 JC1 JDBC 驱动程序。
- 现象:数据库元数据不适合用于 ANSI 数据库。
Informix Dynamic Server 把模式拥有者转换为大写,以便用于 ANSI 数据库,
但是 JDBC 驱动程序却将模式拥有者转换为小写。所以 getTables(...) 不适用于某些情况。
解决方案:该修改可在 Informix JDBC 驱动程序较新的版本中找到,请使用 3.00. JC1 JDBC 驱动程序。
参考资料
关于作者  | |  | Anju Sudhakar 是一名质量保证工程师,他在 Informix Dynamic Server 已经工作了 7 年多。Anju 主要研究 Informix Dynamic Server 和 WebSphere Application Server 之间的互操作性,以及从各种源数据库到 IBM 数据库(包括 DB2 和 IDS)的迁移测试。 |
对本文的评价
|