Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49700
  • 博文数量: 10
  • 博客积分: 557
  • 博客等级: 下士
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-25 20:13
文章分类

全部博文(10)

文章存档

2011年(9)

2010年(1)

分类: 数据库开发技术

2011-11-18 11:03:55

问题: 做过ILE 模式开发的同学都有过这样的经历:

已经执行过的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 OFFRCLACTGRP来先删除activation group,这样activation group中的所有资源就都被释放掉了。然后PGM A再次运行的时候系统自动又会创建activation group,然后会重新加载service program,这样就会使用到新版本的service program了。

下图为我设想的简易流程图

 

 

 

阅读(2238) | 评论(0) | 转发(3) |
0

上一篇:Binary(4) 为什么等价于Integer(10)

下一篇:没有了

给主人留下些什么吧!~~