分类: 数据库开发技术
2015-05-06 17:08:00
已经执行过的service program,重新编译了一个module后,并且更新了相应的service program (UPDSRVPGM),然后再次调用这个service program下的这个module,但是结果显示module并没有更新,举个例子:
整个程序的组织结构关系,我描述的还清楚吧,现在执行:
= =>CALL PGM(PGMA),
则会在屏幕上显示:AAA。
下面把MOD1的功能改成:DSPLY BBB,即:
然后重新编译MOD1、更新SRV0,重新执行CALL PGM(PGMA)
得出的结果仍然是:AAA
刚才明明重新创建了MOD1,并且也进行了UPDSRVPGM,应该打印的是BBB,为什么还是AAA呢?如何才能让程序调用最新的Module呢?
解决办法:
1 最简单粗暴直接的办法就是sign off ,再重新登陆。
2 用命令RCLACTGRP ACTGRP(QILE)
下面是我对此的理解(正确性有待验证):
当更新一个PGM(module)时,旧的程序版本会被系统移到QRPLOBJ这个library中。如果在更新PGM(module)时,PGM(module)恰好处于活动的状态,那么系统会自动让用户继续使用QRPLOBJ中的旧版本程序,而不会报错,当然用户也无法使用新版本的程序。
当再次加载此程序的时候,才会使用新版本的程序。 那什么时候会再次加载程序?
对于service program而言:
1 program运行时系统会检查其activation group是否创建,若没有创建,则会创建activation group。然后系统会在activation group中检查相关的service program是否已经被激活,如果service program尚未被激活,则系统会激活service program;如果service program已经被激活,就不会再次进行激活。简单的说service program 只有在PGM首次运行的时候,才会被激活,并且此后这个service program一直处于活动状态,直到activation group被删除。(RED BOOK)
2 这段完全是我个人的猜想,没找到相关的理论做支撑。当更新service program时,因为service program在第一次被调用的时候,已经被激活了,所以仅仅更新了ASP(硬盘)中的service program,而没有更新activation group中的service program。这时候最直接的想法就是让activation group重新加载service program,这样就可以把ASP中新版本的service program重新加载到activation group中了。但是系统并没有现成的命令,可以删除activation group中的service program再进行重新加载,所以我们要用SIGN OFF和RCLACTGRP来先删除activation group,这样activation group中的所有资源就都被释放掉了。然后PGM A再次运行的时候系统自动又会创建activation group,然后会重新加载service program,这样就会使用到新版本的service program了。
下图为我设想的简易流程图