不知道大家有没有主意到,在创建obj的时候有个系统参数share。它的作用是让运行同一作业的一个或多个程序公用同一个数据通路。简单点说就是多个进程调用只使用同一条到硬盘,内存访问它的路径。缩短了第二次以后打开文件所需要的时间,还能够节省内存占用。
但是,这么一个功能,为什么系统默认参数是*no而不是*yes呢。
不知道大家有没有主意到这个问题。我这里现在没有条件做大负载情况下的测试,来检测修改这个参数对系统性能的影响。大家谁有条件的话测试一下,把结果公布出来。
————希望大家踊跃讨论 :em02:
yoyoage 回复于:2004-05-19 18:15:01 |
如果一个文档在相同的作业/活动组中经常需要被多次按照同一种路径来访问,使用share(*yes)固然是个可以节约资源的好方法。
但是,从编程的角度来考虑,会需要注意到这样几个问题: 1。同一个作业中用到的程序,某些是按照键字排列顺序访问数据库文件,而有些则是按照rrn数来打开该文件。因此不能用共享的访问路径。 2。比如,pgm1第一个打开一个文档filex,只对该文档进行read操作;而pgm调用程序pgm2,在pgm2中要对filex进行update/delete操作,那么在pgm1中打开filex的时候,就应该是以updatable/addable的方式(f-specification中定义)。这就需要我们第一次打开一个文件的时候,允许所有的操作,因为pgm2可能还会掉用其它的程序来对filex进行不确定的操作。这样,某些数据的安全性就得不到保障。 3。如果第一次打开filex的时候用到了commit control,那么其后用共享访问路径打开改该文件的程序中都要求用到commitment control. 4。只有第一次带开数据库文件的时候,override ,f-spec才会有用,其后的override,f-spec都被忽略,除非你在OVRDBF中改变了share或者lvlchk的参数。 |
e_server 回复于:2004-05-20 00:40:34 |
说的好,这么详细的解释。高手~~ |
mamei 回复于:2004-05-20 07:59:32 |
呵呵,楼上的开始谦虚了!!!! |
居士 回复于:2004-05-20 08:54:36 |
yoyoage 解释的,后来我查了一些资料,也是和你解释的差不多。
不过,我是搞系统管理的,对一些开发方面的还是有点模糊,能不能再用通俗一点的,不带有专用术语的语言再解释一下。 我举个例子,对于最简单的400应用--domino。它的数据库为文档型数据库,就是一个一个分开的nsf文件。然后很多用户可能同时调用阅读该文件,比如names.nsf这个数据库。对于非管理员来说,大家只有read的权限那么,可不可以通过share(*yes)来设置它,提高运行效率呢? |
fzrxh 回复于:2004-05-20 11:30:44 |
我想文檔型數據庫與關係型數據庫做法不一樣把 |
居士 回复于:2004-05-20 11:48:05 |
对,我希望我能能讨论讨论share这个参数对两种数据库的性能影响。
大家继续~ |
aeiou 回复于:2004-05-20 13:17:13 |
应该是创建PF或者LF的时候有这个参数。
我原来有篇贴子说过一些:http://chinaunix.net/jh/10/233584.html Share的时候如果不注意,程序之间容易产生指针错位的现象,导致程序运行结果异常。所以一般都不会设置成默认值。而是在需要用的时候通过OVRDBF 来修改。 |
居士 回复于:2004-05-20 14:22:03 |
谢谢。
这里我再把aeiou的帖子转贴一下,供大家讨论: 1.ShareODP: 在PF或者LF编译的时候,有个SHARE(Share Open Data Path)的参数,控制该文件是否共享其打开路径。 如果指定SHARE为*NO的话,程序在每次打开一个文件的时候,都会为该文件建立一次访问路径;如果指定SHARE为*YES的话,程序在第一次打开该文件的时候,系统建立该文件的访问路径,在同一个ActiveGroup中再打开该文件时,就不再重新建立该文件的访问路径,而是共享使用之前建立的路径,从而提高了程序运行的速度。 一般在编译的时候该参数设置为*NO,即不是共享打开。在需要共享打开的时候,使用OVRDBF对该参数进行更改。 使用ShareODP需要注意的一些东西: 1).由于在不同的ActiveGroup之间不能ShareODP,所以如果几个程序在编译的时候没有加入到同一个ActivationGroup中,ShareODP就不会有什么效果。 2).如果PGMA打开FILEA并定位到了第一条记录,然后PGMA调用PGMB;PGMB也打开了FILEA并直接读FILEA,将读到第二条记录;PGMB运行完后PGMA又继续读FILEA下一条记录,此时它读到的将是第三条记录。而如果没有ShareODP的话,PGMA两次读到的会是第一条和第二条记录,PGMB读到的会是第一条记录。 ActiveGroup: 在CRTPGM 的时候,有个参数ACTGRP(ActivationGroup),控制该PGM在运行的时候属于哪个ActiveGroup。如果指定*NEW,则该PGM会重新建立一个ActiveGroup;如果指定为*CALLER,则该PGM会与调用它的PGM使用同一个ActiveGroup。 2.UserOpen: RPG程序在使用F表引用外部文件的时候,有一个KeyWords是USROPN。 在没有使用USROPN的时候:系统会在每次运行该程序的时候自动打开所引用的文件;一般可以通过设置*LR为*ON来自动关闭文件,但是如果是SubProcedure,系统不会自动关闭所打开的文件。 如果指定了USROPN:则系统不再控制文件的打开与关闭,由用户手工进行文件的OPEN与CLOSE;如果一个模块已经打开还没有关闭文件的情况下,该模块将不能再对该文件做打开的操作。 USROPN比系统自动打开文件要慢一些。在打开同一个文件5000次的情况下,USROPN使用了400毫秒,系统自动打开只用了4毫秒。 使用UserOpen需要注意的一些东西: 1).在OPEN之前最好使用 %OPEN(FileName) 检查要打开的文件是否已经打开,如果没有打开再执行OPEN的操作。 2).CLOSE *ALL的命令可以关闭本模块打开的所有文件。如果一个文件没有指定为USROPN,Close *ALL也将关闭该文件。并且如果该模块是不参与RPG Cycle的程序,如一个SubProcedure,则在第二次运行本模块的时候,该文件将不会再自动打开,此时如果再对该文件做操作,就会出错。所以最好指定文件名来CLOSE,并注意只关闭USROPN的文件。 |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/