计划、软件包和动态计划退出
应用程序计划允许应用程序在执行时访问 Db2® 数据。 该计划包含来自从应用程序构建的 DBRM 的 SQL 语句的绑定的,可操作的形式。 它还将整个应用程序进程与将使用它的 Db2 本地实例相关联。
可以将来自 DBRM 的操作 SQL 语句直接放入计划中,在这种情况下,我们说 DBRM 绑定到计划中。 或者,可以将 DBRM 绑定到包中 (使用 BIND PACKAGE 命令) ,该包包含来自单个 DBRM 的可操作 SQL 语句。 您可以将相关包分组到集合中。 然后,可以在软件包列表中包含软件包名称或集合名称,并将软件包列表绑定到计划中。 单个计划可以同时包含程序包列表和直接绑定到该计划的 DBRM。 您可以使用单个 CICS® 应用程序中的 DBRM 来创建计划,也可以使用多个应用程序中的 DBRM 来创建单个计划。 设计 CICS 应用程序与 Db2 计划和包之间的关系 讨论了针对计划和包的不同设计的优点和缺点。
除了创建应用程序外,还需要维护应用程序计划。 如果使用计划在一个或多个应用程序中更改 SQL 语句,那么需要为已更改的应用程序重建 DBRM。 如果将这些 DBRM 的旧版本直接绑定到计划中,那么需要为已更改的程序和任何未更改的程序标识所有直接绑定到该计划中的 DBRM ,然后将它们全部再次绑定到计划中。 将 DBRM 绑定到计划时,应用程序无法使用该计划来访问 Db2。 但是,如果将已更改的应用程序的旧版本 DBRM 绑定到程序包中,然后将程序包的名称 (或包含它们的集合的名称) 包含在方案中的程序包列表中,那么不需要将任何其他程序包或直接绑定的 DBRM 再次绑定到方案中。 将已更改的应用程序的新版本 DBRM 绑定到与旧版本同名的包中。 您不需要再次绑定套餐-它会找到新版本的套餐。 在更改程序包时,应用程序仍可以使用计划中的其他程序包和直接绑定的 DBRM。 有关维护计划的更多信息,请参阅 程序更改后要绑定的内容 。
Db2 中的每个线程都与计划相关-请参阅 概述: 线程如何工作 ,以获取有关线程的更多信息。 每种类型的线程使用的计划在 DB2CONN 定义 (对于池线程) 或线程的 DB2ENTRY 定义 (对于条目线程) 上指定。 当 CICS 请求使用应用程序的线程来访问 Db2时,它会告知 Db2 与该类型的线程相关联的计划的名称,并且 Db2 会找到该计划。 每种类型的线程的定义可以命名特定计划,也可以命名动态计划出口,这是一个例程,用于确定要用于请求线程的事务的计划。
如果池线程或条目线程的定义指定了特定方案,那么所有使用该类型线程的事务都必须使用该方案。 可以使用某种类型的条目线程的事务在线程的 DB2ENTRY 和 DB2TRAN 定义中指定。 如果线程的 DB2ENTRY 定义指定了特定计划,那么可以在所有这些事务标识下运行的所有应用程序中的 DBRM 必须绑定到同一计划中,或者绑定到随后在同一计划中列出的程序包中。 如果在这些事务标识下运行的任何应用程序中的 DBRM 直接绑定到计划中,并且您更改其中任何应用程序中的 SQL 语句,那么在将所有直接绑定的 DBRM 再次绑定到计划中时,整个计划将不可访问。 这意味着在维护计划时,任何事务都不能使用该类型的条目线程。 访问 Db2的 任何 CICS 应用程序都可以使用池线程,因此如果 DB2CONN 定义为池线程指定了特定方案,那么需要使用所有这些应用程序中的 DBRM 来准备和维护该方案。 如果任何 DBRM 已直接绑定到计划中,那么在维护期间将无法访问整个计划,并且任何事务都无法使用池线程。
在维护计划时,有两种方法可避免使线程类型不可用。 最佳解决方案是避免使用程序包将 DBRM 直接绑定到计划中。 如果将每个单独的 DBRM 作为程序包进行绑定,并将它们包括在计划中的程序包列表中,那么在您维护各个程序包时,仍可访问这些计划。 在对特定程序执行维护工作时,与涉及该程序的计划相关的池线程或条目线程仍可用,因为这些计划仍可访问。 这意味着您可以安全地为每个线程指定特定计划。 如果要开始使用包,请参阅 使用 Db2 包 和 Db2 for z/OS 产品文档中的 " Db2 for z/OS 编程" 以获取有关如何实现包的详细信息。
在 Db2中提供软件包之前开发的替代解决方案是使用动态计划出口。 使用动态计划出口意味着您不必为每种类型的线程指定特定计划,因此即使在维护期间无法访问特定计划时,这些线程仍可用。 要实现此解决方案,请为 CICS 应用程序创建许多小型计划,每个计划都包含来自几个紧密相关的程序的 DBRM。 然后,在 PLANITNAME 属性中指定出口程序,而不是在每个线程类型的 DB2CONN 或 DB2ENTRY 定义的 PLAN 属性中指定计划名称。 当应用程序发出其第一个 SQL 语句并且请求了特定类型的线程时,您在线程定义中指定的出口程序将选择要用于该应用程序的计划。 如果在维护期间无法访问特定计划,那么需要该计划的应用程序无法使用线程,但其他应用程序可以将相同类型的线程与自己的计划一起使用。 但是,请注意,一旦为要使用的应用程序创建了某种类型的线程的特定实例,该线程实例就会与选择的动态计划出口的计划相关联。 要使另一个应用程序复用该线程,它必须使用同一计划。 如果动态计划出口为应用程序选择另一个计划,那么它必须使用正确的计划查找或创建另一个线程。 这将减少线程复用的机会。 有关动态计划出口的更多信息,请参阅 动态计划出口 。