随着主机 DB2 技术的发展,DB2 产品的功能越来越丰富,以及 DB2 产品增强了对其分布式访问功能,所以正确配置 DB2 产品提供的存储过程,就越来越重要。对现在的主机用户来说, 9 for z/OS 下的存储过程已经从一个可选项逐渐演变成了在数据库应用开发考虑的重要因素。在主机数据库存储过程的应用方面,除了用户可以根据需要开发存储过程外。主机数据库产品也提供了功能丰富的各类存储过程供用户使用。本篇就是为了帮助主机和开发人员更好的规划和实施基于主机数据库(DB2 for z/OS)的存储过程。

  DB2 版本 9 以后,主机上所有的存储过程都统一由 z/OS 的一个子系统 WLM 来统一管理,WLM 是通过应用环境(Application Environment)来管理存储过程的,当存储过程被调用时,WLM 会自动启动和应用环境相应的启动作业来管理和实现所需要的存储过程功能。

  我们可以把数据库存储过程分为 DB2 系统产品数据库存储过程和用户开发的存储过程。关于 DB2 数据库系统产品的存储过程,按照存储过程的功能,开发语言,性能要求等,我们会设置不同的数据库存储过程运行环境。下面的篇幅会面较详细的介绍这方面的情况。对于用户编写的存储过程,存储过程配置基本原则是一样,都需要根据实际应用开发功能和性能的要求进行规划实施,都需要根据具体要求进行具体分析,这里不再做主要描述。

  存储过程的客户化规划和实施

  在实施主机提供的 DB2 存储过程的时候,就象上文提到的,需要考虑到存储过程调用时的执行要求,这些要求包括存储过程执行的功能是怎么样的,调用时限定条件以及存储过程有无特殊性能要求等。正确配置 DB2 存储过程,以下几个方面是比较重要而应该被重点关注的:

  同存储过程相关的 DB2 子系统配置

  由于 DB2 9 产品发布后,包括针对存储过程在内一些新的功能增强,DB2 系统都是通过实施 PTF 或 APAR 的方式来实现的,所以需要确认相关的数据库产品的 PTF 或 APAR 是否已经正确实施。具体需要实施的 PTF 或 APAR 可以参考相关的资料。

  在 DB2 9 的安装流程里,安装界面 Panel DSNTIPX 是来配置和存储过程相关的参数的,是用来生成安装所需要的 Sample 作业。

  清单 1. DB2 9 安装界面 DSNTIPX

DSNTIPX INSTALL DB2 - ROUTINE PARAMETERS
  ===>
  Scrolling backward may change fields marked with asterisks
  Enter data below:
  * 1 WLM PROC NAME ===> DSN1WLM WLM-established stored procedure JCL PROC
  2 NUMBER OF TCBS ===> 8 Number of concurrent TCBs (1-100)
  3 MAX ABEND COUNT ===> 0 Allowable ABENDs for a procedure (0-255)
  4 TIMEOUT VALUE ===> 180 Seconds to wait before SQL CALL or
  function invocation fails (5-1800,NOLIMIT)
  5 WLM ENVIRONMENT ===> Default WLM env name
  6 MAX OPEN CURSORS ===> 500 Maximum open cursors per thread
  7 MAX STORED PROCS ===> 2000 Maximum active stored procs per thread


  其中,对于 DSNTIPX 所涉及到的参数,下面做一个简要的描述:

  ◆WLM PROC NAME

  用来指定在安装过程中生成 Sample 中作业的缺省存储过程的名字。

  ◆NUMBER OF TCBS

  用来指定在 WLM 启动的一个地址空间里,可以并发调用多少个存储过程。这个值也受到 USS 下的 MAXPROCUSER(每一个用户在主机 USS 环境下最大可以有多少个 processes)参数的限制。

  ◆MAX ABEND COUNT

  在 DSNZPARM 里对应的参数是 STORMXAB,用来指定存储过程可以有多少次调用失败后,整个调用结束。缺省值为 0,意味着在存储过程第一次执行不正常结束时,存储过程调用结束。

  ◆TIMEOUT VALUE

  对应的 DSNZPARM 参数是 STORTIME。用来指定在存储过程地址空间里,DB2 容许等待存储过程分配 TCB 的时间,单位为秒。如果在这个时间段内没有被分配一个 TCB 来执行,存储过程调用失败。推荐不要设为 NOLIMIT,因为如果设为 NOLIMIT,当出现异常例如存储过程地址空间被关掉,存储过程调用请求会一直等待分配 TCB,直到条件满足或者 thread 被取消。

  ◆WLM ENVIRONMENT

  对应的 DSNZPARM 参数为 WLMENV,用来指定在定义存储过程时,如果没有指定 WLM_ENVIRONMENT 的值时,系统会自动分配的 WLM 应用环境的名字。

  ◆MAX OPEN CURSORS

  对应的 DSNZPARM 参数是 MAX_NUM_CUR,用来指定每一个 DB2 应用 thread 最大可以打开的 cursors 数量

  ◆MAX STORED PROCS

  对应的 DSNZPARM 参数是 MAX_ST_PROC。用来设定 DB2 应用 thread 可以调用的最大存储过程数量。在每一次 COMMIT 后,重新开始记数。
主机 WLM 应用环境的规划和实施

  DB2 9 之后,所有的存储过程都运行在 WLM 应用环境管理之下,由于主机数据库下存储过程数量较多,我们在定制的时候,需要把具有类似属性的存储过程定义在一个应用环境下。目的是最大限度的减少 WLM 应用环境的定义数量。当然如果你只是客户化少量的存储过程或者是对某些存储过程有一些特定的要求,例如性能或存储等,也可以定义粒度更小的 WLM 应用环境。另外在一些存储过程里所涉及的数据集里,有一些是需要具有 APF 属性的,需要特别注意。以下为一个 WLM 应用环境的定义例子,例子中应用环境所对应的启动作业为 DB11WLM1。

  清单 2. 主机 WLM 应用环境定义界面

Appl Environment Name . . DB11WLM1
  Description . . . . . . . DB2 DB11WLM1
  Subsystem type . . . . . DB2
  Procedure name . . . . . DB11WLM1
  Start parameters . . . . DB2SSN=&IWMSSNM,NUMTCB=1,APPLENV=DB11WLM1


  创建 DB2 存储过程

  DB2 产品提供的存储过程是通过客户化 DSNTIJSG 作业来定义的。在提交作业完成创建存储过程之前,需要对存储过程进行必要的规划。根据存储过程的功能不同,建议分为以下 4 类:

  表 1. 存储过程的分类

  另外,需要注意以下几点:

  1.存储过程的分类可能会依据 DB2 的 PTF 版本不同而有改变;

  2.存储过程的 NUMTCB 的设置除了根据存储过程的功能要求外,还依赖于系统资源情况;

  3.建议 WLM 应用环境和启动过程名称一致,便于管理;

  4.存储过程分类的粒度根据实际情况可能会有不同,基本原则为在满足功能需求的情况下,尽可能的简化配置,便于管理。

  以下我们重点介绍为四个不同的 WLM 应用环境准备的启动作业过程,通过启动作业可以为 WLM 环境准备不同的存储过程执行环境。

  为在线 Utility 执行而准备的存储过程

  此类存储过程功能是需要调用数据库的在线 UTILITY,例如数据库所提供的 DSNUTILS 和 DSNUTILU,在配置此类存储过程的时候,NUMTCB 要求定义为 1,也就是不容许并发调用。主要是由于在调用时,会生成一些中间文件,如果容许同时调用存储过程的话,这些文件会被互相覆盖,导致不可预料的错误发生。

  以下为此类存储过程所调用的启动作业。在作业中的 SYSIN 是分配一些临时空间存储 Utility 的输入语句。SYSPRINT 是分配临时空间来存储 utility 的输出信息。RNPRIN01 是为 DFSORT 信息所分配的空间,UTPRINT 也是为 DFSORT 信息所分配的空间,DSSPRINT 是当执行 concurrent copies 时,为输出信息分配空间。

  清单 3. 在线 Utility 存储过程对应的 STC 作业

//DB11WLM1 PROC APPLENV=DB11WLM1,DB2SSN=DSN,RGN=0K,NUMTCB=1
  //IEFPROC EXEC PGM=DSNX9WLM,REGION=&RGN,TIME=NOLIMIT,
  // PARM=&DB2SSN,&NUMTCB,&APPLENV
  //STEPLIB DD DISP=SHR,DSN=prefix.SCEERUN
  // DD DISP=SHR,DSN=prefix.SDSNEXIT
  // DD DISP=SHR,DSN=prefix.SDSNLOAD
  //UTPRINT DD SYSOUT=*
  //RNPRIN01 DD SYSOUT=*
  //DSSPRINT DD SYSOUT=*
  //SYSIN DD UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
  //SYSPRINT DD UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)

为通用情况准备的存储过程

  另外,我们为大多数的存储过程准备了一套运行环境,所准备的启动作业如下所示,其中 NUMTCB 可以根据系统资源情况来定,一般推荐可以设置为 40 或 60。

  清单 4. 通用情况下存储过程对应的 STC 作业

//DB11WLM2 PROC APPLENV=DB11WLM2,DB2SSN=DSN,RGN=0K,NUMTCB=40
  //IEFPROC EXEC PGM=DSNX9WLM,REGION=&RGN,TIME=NOLIMIT,
  // PARM=&DB2SSN,&NUMTCB,&APPLENV
  //STEPLIB DD DISP=SHR,DSN=prefix.SCEERUN
  //* DD DISP=SHR,DSN=prefix.SDFHEXCI For CICS
  // DD DISP=SHR,DSN=prefix.SDSNEXIT
  // DD DISP=SHR,DSN=prefix.SDSNLOAD
  //* DD DISP=SHR,DSN=prefix.SCSQLOAD For MQ
  //* DD DISP=SHR,DSN=prefix.SCSQAUTH For MQ
  //* DD DISP=SHR,DSN=prefix.SCSQANLE For MQ
  //*SYSIN DD SYSOUT=* For Debugger and XML
  //*SYSPRINT DD SYSOUT=*
  //*WSERROR DD PATH=/tmp/wsc.err, For WEB_SERVICES
  //* PATHOPTS=(ORDWR,OCREAT,OAPPEND),
  //* PATHMODE=(SIRUSR,SIWU