使 CICS Db2 应用程序能够通过线程安全编程来使用 OTE
CICS Db2® 连接设施包含 CICS Db2 任务相关的用户出口 (TRUE) DFHD2EX1,在应用程序发出 SQL 请求时调用该用户出口。 它管理获取与 Db2的线程连接的过程,以及在 Db2 处理完成时将控制权返回给应用程序的过程。
关于此任务
在 OTE 中,如果调用 TRUE 的 Cobol 用户应用程序符合线程安全编码约定,并将 CICS 定义为线程安全,那么它也可以在 L8 TCB 上运行。 在其第一个 SQL 请求之前,应用程序在 CICS 主 TCB (QR TCB) 上运行。 当它发出 SQL 请求并调用 TRUE 时,控制将传递到 L8 TCB ,并执行 Db2 处理。 从 Db2返回时,如果应用程序是线程安全的,那么它现在将继续在 L8 TCB 上运行。
使用 CONCURRENCY (REQUIRED) 定义的程序从程序启动开始在开放式 TCB 上运行。 对于 CICSAPI 程序, CICS 使用 L8 开放式 TCB ,而不考虑程序的执行键。 对于 OPENAPI 程序,如果设置了 EXECKEY (USER) ,那么 CICS 将使用 L9 TCB ,如果设置了 EXECKEY ( CICS ) ,那么将使用 L8 TCB 设置。
如果满足正确的条件,那么将开放式 TCB 用于 CICS Db2 应用程序将减少 QR TCB 的使用,并避免 TCB 切换。 OTE 的理想 CICS Db2 应用程序是线程安全程序,仅包含线程安全 EXEC CICS 命令,并且仅使用线程安全的用户出口程序。 类似这样的应用程序在发出其第一个 SQL 请求时移至 L8 TCB ,然后通过任意数量的 Db2 请求和应用程序代码继续在 L8 TCB 上运行,而无需进行 TCB 切换。 当应用程序发出多个 SQL 调用时,此情境会产生显着的性能改进。 如果应用程序未发出许多 SQL 调用,那么性能优势可能没有那么重要。
如果程序的执行涉及任何非线程安全的操作,那么 CICS 会在此时切换回 QR TCB。 此类操作包括程序发出的非线程安全 CICS 请求,非线程安全动态计划出口的使用,非线程安全 TRUEs 的使用以及非线程安全全局用户出口 (GLUEs) 的参与。 在开放式 TCB 和 QR TCB 之间来回切换会损害应用程序的性能。
- CICS 必须连接到受支持的 Db2版本。 有关受支持的 Db2 发行版以及必须应用的 APAR 的详细信息,请参阅 https://www.ibm.com/support/pages/uid/swg27018287。
- 系统初始化参数 FORCEQR 不得设置为 YES。 FORCEQR 强制定义为线程安全的程序在 QR TCB 上运行,并且在调查并解决与线程安全定义的程序相关的问题时,可以将其设置为 YES 作为临时度量。
- CICS Db2 应用程序必须具有线程安全的应用程序逻辑 (即, EXEC CICS 命令之间的本机语言代码必须是线程安全的) ,仅使用线程安全的 EXEC CICS 命令,并将 CICS 定义为线程安全的。 仅允许已标识为线程安全的代码在打开的 TCB 上执行。 如果 CICS Db2 应用程序未定义为线程安全应用程序,或者如果它使用非线程安全的 EXEC CICS 命令,那么将进行 TCB 切换,并且将失去 OTE 利用的部分或全部性能优势。
- CICS Db2 连接设施所使用的任何动态计划出口都必须按线程安全标准进行编码,并将其定义为线程安全的 CICS 。 作为 CICS 用户可替换程序启动的缺省动态计划出口 DSNCUEXT 未将 CICS 定义为线程安全,但将备用 CICS提供的样本动态计划出口 DFHD2PXT 定义为线程安全。 请参阅 动态计划出口 以获取更多信息。
- 对于 CICS Db2 应用程序,应用程序所使用的执行路径上的任何 GLUE 都必须编码为线程安全标准,并定义为 CICS 线程安全。 特别是 GLUEs XRMIIN 和 XRMIOUT)。
- 必须将应用程序使用的任何其他 TRUE 定义为 CICS 线程安全或 OPENAPI。
有关如何使应用程序和用户出口程序成为线程安全程序的信息,请参阅 线程安全程序 。 通过将 CICS 的程序定义为线程安全程序,您仅指定应用程序逻辑是线程安全的,而不是指定程序中包含的所有 EXEC CICS 命令都是线程安全的。 CICS 可以确保通过切换到 QR TCB 来安全地处理 EXEC CICS 命令,这些命令尚未转换但仍依赖于准重入性的命令。 为了允许程序在开放式 TCB 上运行, CICS 需要您保证应用程序逻辑是线程安全的。
线程安全且不涉及 TCB 切换的 EXEC CICS 命令在 API 和 SPI 命令的描述中的命令语法图中指示。
如果 OTE 中的用户应用程序未定义为线程安全程序,那么 CICS Db2 TRUE 仍在 L8 TCB 上运行,但应用程序在整个任务中在 QR TCB 上运行。 每次程序发出 SQL 请求时, CICS 都会从 QR TCB 切换到 L8 TCB ,然后再次切换回,因此 OTE 的性能优势将被否定。 如果您的程序在每个 Db2 请求之后使用了非线程安全的用户出口程序和非线程安全的 EXEC CICS 命令,那么将发生 CICS Db2 应用程序的最大 TCB 切换。 尤其是,在 CICS-Db2 主线路径 (例如,在 XRMIIN 或 XRMIOUT 上启用的程序) 上使用非线程安全出口程序会导致 TCB 切换次数超过 CICS 连接到较低版本的 Db2时迂到的级别。
| 程序的并行属性 | CICS Db2 TRUE 操作 | 影响 |
|---|---|---|
| 准西伦特 | 在 L8 TCB 上运行 | 应用程序在 CICS QR TCB 下运行。 TRUEs 在 L8 TCB 下运行, Db2 请求在 L8 TCB 下执行。 对于每个 Db2 请求, CICS 会切换到 CICS QR TCB 和 L8 TCB。 |
| 线程安全 | 在 L8 TCB 上运行 | OTE 开发。 TRUEs 在 L8 TCB 下运行, Db2 请求在 L8 TCB 下执行。 当控制权返回给应用程序时,该应用程序也会在 L8 TCB 上运行。 在任务终止或发出非线程安全的 CICS 请求 (强制切换回 QR TCB) 之前,不需要 TCB 切换。 |
| REQUIRED 与 API (CICSAPI) 一起使用 | 在 L8 TCB 上运行 | OTE 开发。 TRUEs 在 L8 TCB 下运行, Db2 请求在 L8 TCB 下执行。 应用程序从一开始就在 L8 TCB 上运行。 无论程序的执行键如何,该程序始终使用 L8 TCB。 在任务终止之前,或者如果它发出非线程安全的 CICS 请求,强制切换回 QR TCB ,然后切换回 L8 TCB ,那么不需要 TCB 切换。 |
| REQUIRED 与 API (OPENAPI) 一起使用 | 在 L8 TCB 上运行 | OTE 开发。 对于用户密钥 CICS-Db2 应用程序 (以及当存储器保护处于活动状态时) ,并非首选,因为这会导致从 L9 TCB 切换到 L8 TCB ,并针对每个 Db2 请求重新返回。 |
- CICS 必须连接到 Db2。
- FORCEQR 不得设置为 YES。
- CICS Db2 应用程序必须具有线程安全的应用程序逻辑 (即, EXEC CICS 命令之间的本机语言代码必须是线程安全的)。 如果应用程序逻辑不是线程安全的,那么程序必须定义为 CONCURRENCY (QUASIRENT) ,因此必须在 CICS QR TCB 上运行。 在这种情况下,将对每个 Db2 请求进行 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 Db2 应用程序必须仅使用线程安全或开放式 API 动态计划出口, TRUEs 和 GLUEs。 如果使用任何非线程安全出口,那么这将强制切换回 QR TCB。