講解主機DB2 9存儲過程的規(guī)劃和實施技巧
本文主要介紹主機 DB2 上的存儲過程的規(guī)劃和實施經(jīng)驗,幫助用戶了解主機 DB2 上的存儲過程的基本特點及其如何進(jìn)行分類實施。
隨著主機 DB2 技術(shù)的發(fā)展,DB2 產(chǎn)品的功能越來越豐富,以及 DB2 產(chǎn)品增強了對其分布式訪問功能,所以正確配置 DB2 產(chǎn)品提供的存儲過程,就越來越重要。對現(xiàn)在的主機數(shù)據(jù)庫用戶來說,DB2 9 for z/OS 下的存儲過程已經(jīng)從一個可選項逐漸演變成了在數(shù)據(jù)庫應(yīng)用開發(fā)考慮的重要因素。在主機數(shù)據(jù)庫存儲過程的應(yīng)用方面,除了用戶可以根據(jù)需要開發(fā)存儲過程外。主機數(shù)據(jù)庫產(chǎn)品也提供了功能豐富的各類存儲過程供用戶使用。本篇就是為了幫助主機系統(tǒng)和開發(fā)人員更好的規(guī)劃和實施基于主機數(shù)據(jù)庫(DB2 for z/OS)的存儲過程。
DB2 版本 9 以后,主機上所有的存儲過程都統(tǒng)一由 z/OS 的一個子系統(tǒng) WLM 來統(tǒng)一管理,WLM 是通過應(yīng)用環(huán)境(Application Environment)來管理存儲過程的,當(dāng)存儲過程被調(diào)用時,WLM 會自動啟動和應(yīng)用環(huán)境相應(yīng)的啟動作業(yè)來管理和實現(xiàn)所需要的存儲過程功能。
我們可以把數(shù)據(jù)庫存儲過程分為 DB2 系統(tǒng)產(chǎn)品數(shù)據(jù)庫存儲過程和用戶開發(fā)的存儲過程。關(guān)于 DB2 數(shù)據(jù)庫系統(tǒng)產(chǎn)品的存儲過程,按照存儲過程的功能,開發(fā)語言,性能要求等,我們會設(shè)置不同的數(shù)據(jù)庫存儲過程運行環(huán)境。下面的篇幅會面較詳細(xì)的介紹這方面的情況。對于用戶編寫的存儲過程,存儲過程配置基本原則是一樣,都需要根據(jù)實際應(yīng)用開發(fā)功能和性能的要求進(jìn)行規(guī)劃實施,都需要根據(jù)具體要求進(jìn)行具體分析,這里不再做主要描述。
存儲過程的客戶化規(guī)劃和實施
在實施主機提供的 DB2 存儲過程的時候,就象上文提到的,需要考慮到存儲過程調(diào)用時的執(zhí)行要求,這些要求包括存儲過程執(zhí)行的功能是怎么樣的,調(diào)用時限定條件以及存儲過程有無特殊性能要求等。正確配置 DB2 存儲過程,以下幾個方面是比較重要而應(yīng)該被重點關(guān)注的:
同存儲過程相關(guān)的 DB2 子系統(tǒng)配置
由于 DB2 9 產(chǎn)品發(fā)布后,包括針對存儲過程在內(nèi)一些新的功能增強,DB2 系統(tǒng)都是通過實施 PTF 或 APAR 的方式來實現(xiàn)的,所以需要確認(rèn)相關(guān)的數(shù)據(jù)庫產(chǎn)品的 PTF 或 APAR 是否已經(jīng)正確實施。具體需要實施的 PTF 或 APAR 可以參考相關(guān)的資料。
在 DB2 9 的安裝流程里,安裝界面 Panel DSNTIPX 是來配置和存儲過程相關(guān)的參數(shù)的,是用來生成安裝所需要的 Sample 作業(yè)。
清單 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 所涉及到的參數(shù),下面做一個簡要的描述:
◆WLM PROC NAME
用來指定在安裝過程中生成 Sample 中作業(yè)的缺省存儲過程的名字。
◆NUMBER OF TCBS
用來指定在 WLM 啟動的一個地址空間里,可以并發(fā)調(diào)用多少個存儲過程。這個值也受到 USS 下的 MAXPROCUSER(每一個用戶在主機 USS 環(huán)境下最大可以有多少個 processes)參數(shù)的限制。
◆MAX ABEND COUNT
在 DSNZPARM 里對應(yīng)的參數(shù)是 STORMXAB,用來指定存儲過程可以有多少次調(diào)用失敗后,整個調(diào)用結(jié)束。缺省值為 0,意味著在存儲過程第一次執(zhí)行不正常結(jié)束時,存儲過程調(diào)用結(jié)束。
◆TIMEOUT VALUE
對應(yīng)的 DSNZPARM 參數(shù)是 STORTIME。用來指定在存儲過程地址空間里,DB2 容許等待存儲過程分配 TCB 的時間,單位為秒。如果在這個時間段內(nèi)沒有被分配一個 TCB 來執(zhí)行,存儲過程調(diào)用失敗。推薦不要設(shè)為 NOLIMIT,因為如果設(shè)為 NOLIMIT,當(dāng)出現(xiàn)異常例如存儲過程地址空間被關(guān)掉,存儲過程調(diào)用請求會一直等待分配 TCB,直到條件滿足或者 thread 被取消。
◆WLM ENVIRONMENT
對應(yīng)的 DSNZPARM 參數(shù)為 WLMENV,用來指定在定義存儲過程時,如果沒有指定 WLM_ENVIRONMENT 的值時,系統(tǒng)會自動分配的 WLM 應(yīng)用環(huán)境的名字。
◆MAX OPEN CURSORS
對應(yīng)的 DSNZPARM 參數(shù)是 MAX_NUM_CUR,用來指定每一個 DB2 應(yīng)用 thread 最大可以打開的 cursors 數(shù)量
◆MAX STORED PROCS
對應(yīng)的 DSNZPARM 參數(shù)是 MAX_ST_PROC。用來設(shè)定 DB2 應(yīng)用 thread 可以調(diào)用的最大存儲過程數(shù)量。在每一次 COMMIT 后,重新開始記數(shù)。
主機 WLM 應(yīng)用環(huán)境的規(guī)劃和實施
DB2 9 之后,所有的存儲過程都運行在 WLM 應(yīng)用環(huán)境管理之下,由于主機數(shù)據(jù)庫下存儲過程數(shù)量較多,我們在定制的時候,需要把具有類似屬性的存儲過程定義在一個應(yīng)用環(huán)境下。目的是最大限度的減少 WLM 應(yīng)用環(huán)境的定義數(shù)量。當(dāng)然如果你只是客戶化少量的存儲過程或者是對某些存儲過程有一些特定的要求,例如性能或存儲等,也可以定義粒度更小的 WLM 應(yīng)用環(huán)境。另外在一些存儲過程里所涉及的數(shù)據(jù)集里,有一些是需要具有 APF 屬性的,需要特別注意。以下為一個 WLM 應(yīng)用環(huán)境的定義例子,例子中應(yīng)用環(huán)境所對應(yīng)的啟動作業(yè)為 DB11WLM1。
清單 2. 主機 WLM 應(yīng)用環(huán)境定義界面
Appl Environment Name . . DB11WLM1
Description . . . . . . . DB2 DB11WLM1
Subsystem type . . . . . DB2
Procedure name . . . . . DB11WLM1
Start parameters . . . . DB2SSN=&IWMSSNM,NUMTCB=1,APPLENV=DB11WLM1
創(chuàng)建 DB2 存儲過程
DB2 產(chǎn)品提供的存儲過程是通過客戶化 DSNTIJSG 作業(yè)來定義的。在提交作業(yè)完成創(chuàng)建存儲過程之前,需要對存儲過程進(jìn)行必要的規(guī)劃。根據(jù)存儲過程的功能不同,建議分為以下 4 類:
表 1. 存儲過程的分類
另外,需要注意以下幾點:
1.存儲過程的分類可能會依據(jù) DB2 的 PTF 版本不同而有改變;
2.存儲過程的 NUMTCB 的設(shè)置除了根據(jù)存儲過程的功能要求外,還依賴于系統(tǒng)資源情況;
3.建議 WLM 應(yīng)用環(huán)境和啟動過程名稱一致,便于管理;
4.存儲過程分類的粒度根據(jù)實際情況可能會有不同,基本原則為在滿足功能需求的情況下,盡可能的簡化配置,便于管理。
以下我們重點介紹為四個不同的 WLM 應(yīng)用環(huán)境準(zhǔn)備的啟動作業(yè)過程,通過啟動作業(yè)可以為 WLM 環(huán)境準(zhǔn)備不同的存儲過程執(zhí)行環(huán)境。
為在線 Utility 執(zhí)行而準(zhǔn)備的存儲過程
此類存儲過程功能是需要調(diào)用數(shù)據(jù)庫的在線 UTILITY,例如數(shù)據(jù)庫所提供的 DSNUTILS 和 DSNUTILU,在配置此類存儲過程的時候,NUMTCB 要求定義為 1,也就是不容許并發(fā)調(diào)用。主要是由于在調(diào)用時,會生成一些中間文件,如果容許同時調(diào)用存儲過程的話,這些文件會被互相覆蓋,導(dǎo)致不可預(yù)料的錯誤發(fā)生。
以下為此類存儲過程所調(diào)用的啟動作業(yè)。在作業(yè)中的 SYSIN 是分配一些臨時空間存儲 Utility 的輸入語句。SYSPRINT 是分配臨時空間來存儲 utility 的輸出信息。RNPRIN01 是為 DFSORT 信息所分配的空間,UTPRINT 也是為 DFSORT 信息所分配的空間,DSSPRINT 是當(dāng)執(zhí)行 concurrent copies 時,為輸出信息分配空間。
清單 3. 在線 Utility 存儲過程對應(yīng)的 STC 作業(yè)
//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)
為通用情況準(zhǔn)備的存儲過程
另外,我們?yōu)榇蠖鄶?shù)的存儲過程準(zhǔn)備了一套運行環(huán)境,所準(zhǔn)備的啟動作業(yè)如下所示,其中 NUMTCB 可以根據(jù)系統(tǒng)資源情況來定,一般推薦可以設(shè)置為 40 或 60。
清單 4. 通用情況下存儲過程對應(yīng)的 STC 作業(yè)
//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,SIWUSR,SIRGRP,SIWGRP,SIROTH,SIWOTH)
REXX 語言編寫的存儲過程
對于由 REXX 語言寫的存儲過程來說,啟動作業(yè)同其他類型的存儲過程是不同的。見下面的例子。需要特別提出的是,REXX 類型的存儲過程的 NUMTCB 應(yīng)該設(shè)為 1。
清單5. REXX 存儲過程對應(yīng)的STC作業(yè)
//DB11WLMR PROC APPLENV=DB11WLM_REXX,DB2SSN=DSN,RGN=0K,NUMTCB=1
//IEFPROC EXEC PGM=DSNX9WLM,REGION=&RGN,TIME=NOLIMIT,
// DYNAMNBR=5, <== Allow for Dyn Allocs
// PARM='&DB2SSN,1,&APPLENV' <== Use 1, not NUMTCB
//*
//NUMTCB@1 SET NUMTCB= <== Null NUMTCB symbol
//*
//* Include SDSNEXIT to use Secondary Authids (DSN3@ATH DSN3@SGN exits)
//STEPLIB DD DISP=SHR,DSN=prefix.RUNLIB.LOAD
// DD DISP=SHR,DSN=CBC!!.SCCNCMP <== C Compiler
// DD DISP=SHR,DSN=prefix.SCEERUN <== LE runtime
// DD DISP=SHR,DSN=prefix.SDSNEXIT
// DD DISP=SHR,DSN=prefix.SDSNLOAD
//SYSEXEC DD DISP=SHR,DSN=DSN!!0.SDSNCLST <== Location of DSNTPSMP
//SYSTSPRT DD SYSOUT=*
//CEEDUMP DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSABEND DD DUMMY
//DSNTRACE DD SYSOUT=*
//*
//**** Data sets required by the SQL Procedures Processor
//SQLDBRM DD DISP=SHR, <== DBRM Library
// DSN=DSN!!0.DBRMLIB.DATA
//SQLCSRC DD DISP=SHR, <== Generated C Source
// DSN=DSN!!0.SRCLIB.DATA
//SQLLMOD DD DISP=SHR, <== Application Loadlib
// DSN=DSN!!0.RUNLIB.LOAD
//SQLLIBC DD DISP=SHR, <== C header files
// DSN=CEE!!.SCEEH.H
// DD DISP=SHR,
// DSN=CEE!!.SCEEH.SYS.H
// DD DISP=SHR, <== Debug header file
// DSN=DSN!!0.SDSNC.H
//SQLLIBL DD DISP=SHR, <== Linkedit includes
// DSN=CEE!!.SCEELKED
// DD DISP=SHR,
// DSN=DSN!!0.SDSNLOAD
//SYSMSGS DD DISP=SHR, <== Prelinker msg file
// DSN=CEE!!.SCEEMSGP(EDCPMSGE)
//*
//**** DSNTPSMP Configuration File - CFGTPSMP (optional)
//* A site provided sequential dataset or member, used to
//* define customized operation of DSNTPSMP in this APPLENV.
//*CFGTPSMP DD DISP=SHR,DSN=
//*
//**** Workfiles required by the SQL Procedures Processor
//SQLSRC DD UNIT=SYSALLDA,SPACE=(23440,(20,20)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=23440)
//SQLPRINT DD UNIT=SYSALLDA,SPACE=(23476,(20,20)),
// DCB=(RECFM=VB,LRECL=137,BLKSIZE=23476)
//SQLTERM DD UNIT=SYSALLDA,SPACE=(23476,(20,20)),
// DCB=(RECFM=VB,LRECL=137,BLKSIZE=23476)
//SQLOUT DD UNIT=SYSALLDA,SPACE=(23476,(20,20)),
// DCB=(RECFM=VB,LRECL=137,BLKSIZE=23476)
//SQLCPRT DD UNIT=SYSALLDA,SPACE=(23476,(20,20)),
// DCB=(RECFM=VB,LRECL=137,BLKSIZE=23476)
//SQLUT1 DD UNIT=SYSALLDA,SPACE=(23440,(20,20)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=23440)
//SQLUT2 DD UNIT=SYSALLDA,SPACE=(23440,(20,20)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=23440)
//SQLCIN DD UNIT=SYSALLDA,SPACE=(32000,(20,20))
//SQLLIN DD UNIT=SYSALLDA,SPACE=(3200,(30,30)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3200)
//SQLDUMMY DD DUMMY
//SYSMOD DD UNIT=SYSALLDA,SPACE=(23440,(20,20)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=23440)
JAVA 語言應(yīng)用準(zhǔn)備的存儲過程
對與 JAVA 語言編寫的存儲過程,由于主機上的 JAVA 是運行在 USS 下,所以需要指定指定 JAVA 運行環(huán)境,見啟動過程中的 JAVAENV 所指定的數(shù)據(jù)集。
清單6. JAVA 存儲過程對應(yīng)的STC作業(yè)
//DB11WLMJ PROC APPLENV=DB11WLM_JAVA,DB2SSN=DSN,RGN=0K,NUMTCB=5
//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
//JAVAENV DD DISP=SHR,DSN=prefix.DB11WLMJ.JAVAENV
//JSPDEBUG DD SYSOUT=*
//JAVAOUT DD PATH='/V1R7/USR/db2a10/JAVAOUT.TXT',
// PATHOPTS=(ORDWR,OCREAT,OAPPEND),
// PATHMODE=(SIRUSR,SIWUSR,SIRGRP,SIWGRP,SIROTH,SIWOTH)
//JAVAERR DD PATH='/V1R7/USR/db2a10/JAVAERR.TXT',
// PATHOPTS=(ORDWR,OCREAT,OAPPEND),
// PATHMODE=(SIRUSR,SIWUSR,SIRGRP,SIWGRP,SIROTH,SIWOTH)
其中 JAVAENV 指定 JAVA 運行環(huán)境定義,JAVAENV 文件的內(nèi)容,舉一例子做參考:
清單7. JAVAENV 配置文件信息
ENVAR('_CEE_ENVFILE=/u/db2tdbg/nolimit.txt',
'JAVA_HOME=/u/java/J1.4'),
MSGFILE(JSPDEBUG,,,,ENQ),
XPLINK(ON)
其中 nolimit.txt 的配置信息如下:
清單8. JAVAENV 配置文件中 nolimit.內(nèi)容信息
LIBPATH=/griv2r2/lib:/usr/lpp/db2810/lib
CLASSPATH=/egfv1r1/egfsproc.jar:/usr/lpp/db2810/classes/db2j2classes.zip
:/u/java/J1.4/lib/charsets.jar
DB2_HOME=/usr/lpp/db2810/
WORK_DIR=/u/db2tdbg
TMSUFFIX=/griv2r2/griserver.jar:/griv2r2/griobjects.jar
:/griv2r2/xercesImpl.jar:/griv2r2/xmlapis.jar
:/griv2r2/grinls.jar:/griv2r2/griuf.jar:/griv2r2/bicompare.jar
PATH=/u/java/J1.4/bin
DB2SQLJPROPERTIES=/u/db2tdbg/db2sqljjdbc.properties
STEPLIB=SYS1.DSN810.PE01.SDSNEXIT:DSN810.SDSNLOAD:DSN810.SDSNLOD2
JAVA_HOME=/u/java/J1.4
其中 /u/db2tdbg/db2sqljjdbc.properties 的配置信息為:
清單9.JAVAENV 配置文件 db2sqljjdbc.properties 配置信息
DB2SQLJSSID=PE11
DB2SQLJPLANNAME=DSNJDBC
DB2SQLJ_TRACE_FILENAME=/tmp/javatrc.db2tdbg
DB2CURSORHOLD=YES
DB2SQLJMULTICONTEXT=YES
DB2SQLJATTACHTYPE=RRSAF
DB2SQLJDBRMLIB=DSNPE01.V8.DBRMLIB.DATA
DB2CURSORHOLD=YES
db2.connpool.max.size=100
db2.jdbc.profile.pathname=/usr/lpp/db2810/classes/DSNJDBC_JDBCProfile.ser
最后,用戶可以通過配置客戶端來連接 DB2 子系統(tǒng)使用存儲過程提供的功能,在連接前,需要保證在服務(wù)器端 DDF(Distributed Data Facility)已經(jīng)配置并正常啟動。
在DB2命令窗口里輸入以下命令:
清單10. DB2 分布式連接配置命令
db2 catalog tcpip node remote server
db2 catalog dcs database as
db2 catalog database as
at node authentication DCS
以上信息可以通過在 MVS console 輸入以下命令–DISPLAY DDF 命令來確定 DB2 子系統(tǒng)的 DB2 location,IP 地址和 TCP 端口號等連接信息。在正確配置好客戶端后,我們可以通過以下命令來連接 DB2 子系統(tǒng):
清單11. DB2分布式連接命令
db2 connect to user using
