使 CICS IMS 应用程序可以通过线程安全式编程来使用开放式事务环境 (OTE)

CICS® IMS 连接设施包含在应用程序发出 IMS 请求时调用的 CICS IMS 数据库适配器 DFHDBAT。 它管理获取与 IMS 的线程连接的过程,以及 IMS 处理完成时将控制权交还给应用程序的过程。

关于此任务

CICS IMS 连接设施使用 OTE 使 CICS IMS 任务相关的用户出口 (TRUE) 能够在不切换 TCB 的情况下从 IMS 调用和返回。 在 OTE 中, CICS IMS TRUE 作为线程安全的开放式 API TRUE 程序运行-在连接处理期间使用 ENABLE PROGRAM 命令上的 OPENAPI 选项自动启用。 这使它能够在打开的 L8 方式 TCB 上接收控制。 对 IMS 的请求也在 L8 TCB 上发出,因此它充当线程 TCB ,并且不需要切换到子任务 TCB。

在 OTE 中,如果调用 TRUE 的用户应用程序符合线程安全编码约定并将 CICS 定义为线程安全,那么它也可以在 L8 TCB 上运行。 在其第一个 IMS 请求之前,应用程序在 CICS 主 TCB (QR TCB) 上运行。 当它发出 IMS 请求并调用 TRUE 时,控件将传递到 L8 TCB ,并执行 IMS 处理。 从 IMS 返回时,如果应用程序是线程安全的,那么它现在将继续在 L8 TCB 上运行。

使用 CONCURRENCY (REQUIRED) 定义的程序从程序启动开始在开放式 TCB 上运行。 对于 CICSAPI 程序, CICS 使用 L8 开放式 TCB ,而不考虑程序的执行键。 对于 OPENAPI 程序,如果设置了 EXECKEY (USER) ,那么 CICS 将使用 L9 TCB ,如果设置了 EXECKEY ( CICS ) ,那么将使用 L8 TCB 设置。

如果满足正确的条件,那么对 CICS IMS 应用程序使用开放式 TCB 将减少 QR TCB 的使用,并避免 TCB 切换。 OTE 的理想 CICS IMS 应用程序是线程安全程序,仅包含线程安全的 EXEC CICS 命令,并且仅使用线程安全的用户出口程序。 类似这样的应用程序在发出其第一个 IMS 请求时移至 L8 TCB ,然后继续通过任意数量的 IMS 请求和应用程序代码在 L8 TCB 上运行,而不需要 TCB。 在应用程序发出多个 IMS 调用时,此情境会产生显着的性能改进。 如果应用程序未发出许多 IMS 调用,那么性能优势可能没有那么重要。

如果程序的执行涉及任何非线程安全的操作,那么 CICS 会在此时切换回 QR TCB。 此类操作包括程序发出的非线程安全 CICS 请求,非线程安全的 TRUEs 的使用以及非线程安全的全局用户出口 (GLUEs) 的参与。 在开放式 TCB 和 QR TCB 之间来回切换会损害应用程序的性能。

为了获得 OTE for CICS IMS 应用程序的性能优势,必须满足以下条件:
  • CICS 必须连接到 IMS V12 或更高版本。
  • 系统初始化参数 FORCEQR 不得设置为 YES。 FORCEQR 强制定义为线程安全的程序在 QR TCB 上运行,并且可以将其设置为 YES 作为临时度量,同时调查并解决与线程安全定义的程序连接的问题。
  • CICS IMS 应用程序必须具有线程安全的应用程序逻辑 (即, EXEC CICS 命令之间的本机语言代码必须是线程安全的) ,仅使用线程安全的 EXEC CICS 命令,并将 CICS 定义为线程安全的。 仅允许已标识为线程安全的代码在打开的 TCB 上执行。 如果 CICS IMS 应用程序未定义为线程安全应用程序,或者如果它使用非线程安全的 EXEC CICS 命令,那么将进行 TCB 切换,并且将失去 OTE 利用的部分或全部性能优势。
  • 应用程序所使用的执行路径上的任何 GLUE 都必须编码为线程安全标准,并将 CICS 定义为线程安全 (对于 CICS IMS 应用程序)。 特别是 GLUEs XRMIIN 和 XRMIOUT)。
  • 必须将应用程序使用的任何其他 TRUE 定义为 CICS 线程安全或 OPENAPI。

有关如何使应用程序和用户出口程序成为线程安全程序的信息,请参阅 线程安全程序 。 通过将 CICS 的程序定义为线程安全程序,您仅指定应用程序逻辑是线程安全的,而不是指定程序中包含的所有 EXEC CICS 命令都是线程安全的。 CICS 可以确保通过切换到 QR TCB 来安全地处理 EXEC CICS 命令,这些命令尚未转换但仍依赖于准重入性的命令。 为了允许程序在开放式 TCB 上运行, CICS 需要您保证应用程序逻辑是线程安全的。

线程安全且不涉及 TCB 切换的 EXEC CICS 命令在 API 和 SPI 命令的描述中的命令语法图中指示。

如果 OTE 中的用户应用程序未定义为线程安全程序,那么 CICS IMS TRUE 仍在 L8 TCB 上运行,但应用程序在整个任务中在 QR TCB 上运行。 每当程序发出 IMS 请求时, CICS 就会从 QR TCB 切换到 L8 TCB 并重新返回,因此 OTE 的性能优势将被否定。 如果您的程序在每个 IMS 请求之后使用了非线程安全的用户出口程序和非线程安全的 EXEC CICS 命令,那么将发生 CICS IMS 应用程序的最大 TCB 切换。 尤其是,在 CICS-IMS 主线路径上使用非线程安全出口程序 (例如,在 XRMIIN 或 XRMIOUT 上启用的程序) 会导致比 CICS 连接到较低版本的 IMS时迂到的级别更多的 TCB 切换。

此表显示了当具有不同并行属性的应用程序在 CICS 连接到不同版本的 IMS时调用 CICS IMS TRUE 时发生的情况。
表 1. 应用程序与 CICS IMS TRUE 的组合
程序的并行属性 CICS IMS TRUE 操作 结果
准西伦特 线程安全和开放式 API 应用程序在 CICS QR TCB 下运行。 TRUE 在 L8 TCB 下运行,而 IMS 请求在 L8 TCB 下执行。 对于每个 IMS 请求, CICS 会切换到 CICS QR TCB 和 L8 TCB。
线程安全 线程安全和开放式 API OTE 开发。 TRUE 在 L8 TCB 下运行,而 IMS 请求在 L8 TCB 下执行。 当控制权返回给应用程序时,该应用程序也会在 L8 TCB 上运行。 在任务终止或发出非线程安全的 CICS 请求 (强制切换回 QR TCB) 之前,不需要 TCB 切换。
REQUIRED 与 API (CICSAPI) 一起使用 线程安全和开放式 API OTE 开发。 TRUE 在 L8 TCB 下运行,而 IMS 请求在 L8 TCB 下执行。 应用程序从一开始就在 L8 TCB 上运行。 无论程序的执行密钥如何,该程序始终使用 L8 。 在任务终止之前,或者如果它发出非线程安全的 CICS 请求,强制切换回 QR TCB ,然后切换回 L8 TCB ,那么不需要 TCB 切换。
REQUIRED 与 API (OPENAPI) 一起使用 线程安全和开放式 API OTE 开发。 对于用户密钥 CICS-IMS 应用程序 (以及当存储器保护处于活动状态时) ,并非首选,因为这会导致从 L9 TCB 切换到 L8 TCB ,并针对每个 IMS 请求再次切换。
总之,要获得 OTE 的性能优势:
  • CICS 必须连接到 IMS V12 或更高版本。
  • FORCEQR 不得设置为 YES。
  • CICS IMS 应用程序必须具有线程安全的应用程序逻辑 (即, EXEC CICS 命令之间的本机语言代码必须是线程安全的)。 如果应用程序逻辑不是线程安全的,那么程序必须定义为 CONCURRENCY (QUASIRENT) ,因此必须在 CICS QR TCB 上运行。 在这种情况下,将对每个 IMS 请求进行 TCB 切换,即使 TRUE 在开放式 TCB 上运行也是如此。
  • 可以将线程安全应用程序定义为 CICS 的 CONCURRENCY (THREADSAFE) API (CICSAPI) 或 CONCURRENCY (REQUIRED) API (CICSAPI)。 要使用的设置取决于程序使用的非线程安全 EXEC 命令数。 如果有许多非线程安全的 CICS 命令,那么程序最好定义为 CONCURRENCY (THREADSAFE)。 如果程序具有很少或没有非线程安全的 CICS 命令,那么可以使用 CONCURRENCY (REQUIRED)。 使用 CONCURRENCY (REQUIRED) 定义的程序具有在 L8 开放式 TCB 上启动的优点,但每个非线程安全的 CICS 命令都会导致两个 TCB 切换。
  • CICS IMS 应用程序必须仅使用线程安全的 TRUEs 或 GLUEs。 如果使用任何非线程安全出口,那么这将强制切换回 QR TCB。
如果满足所有这些条件,您可以获得 OTE 的性能优势。