AS/400开发经验点滴(八)
使用共享文件打开提高软件性能
1. 共享文件(Share File)
AS/400提供共享文件支持,根据定义,所有的数据库文件都能被多个用户在同一时间使用。但是某些操作会锁住文件、成员或记录,使之在不同作业之间不能共享。在文件参数中有一个SHARE参数,当把该参数设置为*YES时,就表示该文件已经设置为共享文件。可以通过CHGPF、CHGLF、OVRDBF命令来修改该参数。
SHARE 参数允许多个程序共享文件状态、位置和存储区。它可以通过减小作业所需的主存储器量和缩短打开和关闭文件所需的时间来提高性能。原始程序模型(OPM)和ILE程序模型都支持共享文件。
2. 共享打开(Share Open)与打开(开放)数据路径(Open Data Path)
AS/400在打开任一文件时,都会建立一个数据路径(Open Data Path),简称ODP。如果文件Share参数设置为*NO,那么每个程序每次打开都要建立一个新的ODP。如果Share参数设置为*YES,那么通过适当操作,对于在同一作业或活动组内的打开操作,只有第一次打开才会建立一个ODP,以后打开不再建立ODP(实际上是不再执行打开操作),这就是共享打开。这是共享文件减小作业所需主存储器量和缩短打开关闭文件所需时间的途径。对于记日志的文件,可以用DSPJRN查看日志记录中打开项(OP)来验证。
对于OPM类 程序,共享打开只能让在同一作业中的两个和多个程序共享一个打开数据通路 (ODP)。在 ILE 程序中,共享文件的作用域可限于同一作业或同一活动组(activation group),Share open不能在活动组之间共享。活动组是运行期作业的子结构。它由分配给一个和多个程序的系统资源(程序或过程变量存储器等)组成。
3. 共享打开问题
(1) 设置Share参数
用OVRDBF覆盖文件Share参数为*YES:
OVRDBF FILE(ODPTESTF) SHARE(*YES)
系统只处理首次打开时共享文件指定的覆盖和程序说明,在后续打开时指定的覆盖和程序说明将被忽略。
(2) 打开方式
共享文件在第一次打开之后,以后的所有文件打开操作仍需要被指定。而且必须与第一次打开操作相匹配。比如共享文件第一次打开,需要指定INPUT/OUTPUT,那么以后所有的打开也都需要指定INPUT/OUTPUT。如果第一次打开使用了commitment control,那么以后所有的打开也都需要使用commitment control。这样必须确保在作业中首次打开共享文件时,指定该文件的后续打开所需的所有打开选项,为了在某些高级语言中实现这一点,可能要使用永远不会运行的文件操作语句。
(3) 在作业中共享文件不可能情况
如果有不同程序必须要求打开方式不同,那么就不能共享ODP,也就不能执行共享打开。例如,一个程序可能需要按到达顺序排列的文件记录,而另一程序可能需要按键控顺序排列的记录。或者,您可能将同一文件用于打印输出,但想从每个程序独立地生成输出。在这些情况下,不应共享打开数据通路。需要在覆盖命令OVRDBF上指定 SHARE(*NO) 来确保程序不在作业中共享文件。
(4) ILE程序中活动组
对于OPM程序,共享打开只在一个作业内有效,对于ILE程序,共享打开可以在一个活动组内有效。可以参考有关手册以确保不同作业在同一个活动组内,以保证共享打开有效。
(5) 关闭
用CLOF命令来关闭共享打开。只有当最后一个打开共享ODP的程序关闭文件时,一个完整的关闭过程才执行,即释放文件锁、强制改变数据写到硬盘里,摧毁打开数据路径。
4. 共享打开示范例子
下面通过一个CL程序来打开共享文件,并调用两个RPG程序。示范文件ODPTESTF已通过STRJRNPF 命令加入到日志中。
CL程序:
[code:1:2c4f8ff7c0]PGM
STRCMTCTL LCKLVL(*CHG)
MONMSG MSGID(CPF8351)
OVRDBF FILE(ODPTESTF) SHARE(*YES)
OPNDBF FILE(ODPTESTF) OPTION(*ALL) COMMIT(*YES)
CALL PGM(ODPTESTR)
CALL PGM(ODPTESTR1)
CLOF OPNID(ODPTESTF)
OVRDBF FILE(ODPTESTF) SHARE(*NO)
RCLRSC
ENDCMTCTL
ENDPGM[/code:1:2c4f8ff7c0]RPG程序:
[code:1:2c4f8ff7c0]FODPTESTF UF A E K DISK COMMIT
C ………………
C WRITE ODPTESTR
C COMMIT
C*
C*---------------------------------------------
C END TAG
C RETURN [/code:1:2c4f8ff7c0]
5. 共享打开的文件集(sets of files)
有时候,文件和程序都非常多,打开方式也很不一样。这时候可以对文件进行分类,使对不同程序经常使用的文件形成多个文件集。对每一个文件集,用一个CL程序来执行共享打开。这些不同的CL的程序可以被一个共同的主调程序调用。比如使用多个文件集可以对交易进行分类来处理共享打开问题。
6. 共享打开存在的问题
使用共享文件打开,可以提高程序性能,但这将可能会增加程序处理的复杂度,也可能会带来一些问题。比如当共享文件后,必须自己管理记录的位置和记录锁。如果不是特别追求程序性能,可以不需要考虑共享打开。
BLOGLIOU
2005.1.13
[code:1:2c4f8ff7c0][/code:1:2c4f8ff7c0]
goodbyevalentine 回复于:2005-03-03 08:58:03 |
宝哥就是牛啊!哈哈,猜不到我是谁吧? |
blogliou 回复于:2005-03-04 10:02:13 |
[quote:a3d32528fa="goodbyevalentine"]宝哥就是牛啊!哈哈,猜不到我是谁吧?[/quote:a3d32528fa]
应该是熟人,但真猜不到你是谁,不好意思。可发我短消息。 |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/