niuhua77 发表于 2011-09-08 14:24

DATA AREA和DATA QUEUE的区别之我见(一)

本帖最后由 niuhua77 于 2011-09-09 08:22 编辑

网上流传一道题:data area和data queue的区别。
我个人觉得data area和data queue除了长的比较像之外,其可比性并不大。从大的方向说,data area和data queue的共同点仅仅是二者都可以完成不同job间的通讯的功能(即数据交换),但是相同的功能还可以由 PF,user space等完成,为什么没人把它们都拿来一起比较呢?因为长的不像?? hoho~~~
下面分别介绍一下Data Area和Data Queue,希望能给困惑者带来一点帮助,不对的地方欢迎指正。

Data Area

一 基本信息
      Data Area在系统中用*DTAARA来表示,实际上OS400把Data Area当作一个单独的字段。
      Data Area中存储的数据类型有3种,分别是*CHAR、*DEC、*LGL。它们的最大的长度分别为:
       *CHAR——2000个字符
       *DEC ——1个数字(最长为24 digits, 9 decimal positions。实际上长度不能超过15)
       *LGL ——1个逻辑值(‘1’或者‘0’)
由此可见,Data Area所能保存的信息量十分有限,对于*DEC和*LGL来说,仅仅能保存一个数值;对与*CHAR类型来说,能保存2000个字符的数据。所以,Data Area不适用于大量数据的处理。通常用Data Area来保存一些被多个job共用的控制信息。另外,Data Area仅仅是一个单独的字段,不需要像PF中那样用游标来定位记录,所以打开一个Data Area的系统开销要比打开一个PF要小的多,效率高得多。这就是Data Area最大的优点。

二 使用方法
      Data Area的创建、删除、修改、显示可以用CL命令在命令行上操作,或者在CLP程序中操作,都比较简单就不多说了。下面说一下在RPGLE中的使用方法。
      RPG中关于Data Area的操作符有以下几个:IN、OUT、*LOCK、UNLOCK,
      IN:读取Data Area
      OUT:输出更新Data Area并解锁
      *LOCK: 为Data Area加上锁
      UNLOCK:为Data Area 解锁
下面举个例子来说明Data Area的基本操作:

D Total             DS               DTAARA(TotDat)   //定义Data Area
DAmount                     8 S2OVERLAY(Total:1)
C            *LOCK    IN      Total   //读取并且锁住Data Area
* // your code……
C                      OUT   Total   //更新并且释放Data Area锁
OR
C            *LOCK    IN      Total   //读取并且锁住Data Area
* // your code……
C                  UNLOCK   Total   //释放Data Area锁

关于一般的Data Area的锁,做个说明:

1Data Area的锁是独占只读锁(exclusive, allow read),如果某Data Area已经被锁住了,那么其他的作业只能以只读的方式访问此Data Area,不能用OUT操作。

2 如果想在程序中更新Data Area,则必须先锁住此Data Area(跟UPDATE PF一个道理)。如果没有锁住Data Area,就在那么在程序中用OUT的话,程序会报错,例如:
C                  IN      Total   
* // your code……   没有锁住data area就输出,是不可以的。
C                  OUT    Total   

3 Data Area上锁可以通过
      1)使用*LOCKIN 方式
      2)使用Data Area Data Structure方式(稍后介绍)

4 Data Area 解锁可以通过
      1)OUT——更新并解锁
      2)UNLOCK ——解锁
      3)程序结束并且*INLR=*ON,则锁自然解除。

三 Data Area Data Structure

这种类型的Data Area有点特殊,使用起来会方便一些
定义:
D Total             UDS             DTAARA(TotDat)   //定义Data Area
DAmount                     8 S2OVERLAY(Total:1)
Data Area Data Structure与普通的Data Area定义有一点差异,就是在DS keyword的前面加上一个U,即:UDS
使用方法:
Data Area Data Structure的特别之处就在于,它隐含了两行的代码,如下:
C            *LOCK    IN      Total   //读取并且锁住Data Area
*……
C                      OUT   Total   //更新并且释放Data Area锁
就是说如果定义成Data Area Data Structure的话,那么程序会自动读取并锁住此Data Area,并且在程序结束的时候,会自动输出更新Data Area并释放锁。所以如果定义成Data Area Data Structure的话,就不需要上面的两行代码了。

四 *LDA——Local Data Area
      *LDA算是一种特殊的Data Area,它是长度为1024个字节的字符串,并由系统自动为每个job创建和删除。
每个job只能操作自己的*LDA,不能操作、获取其他job的*LDA的数据。就是说在同一个job内,你愿意怎么折腾都行,但是你不能共享别的job的*LDA,别的JOB也不能共享你的JOB的*LDA。不过有一种特例,即递交出去的作业是可以继承原来作业的*LDA的内容。假如JOB A 用SBMJOB递交出了一个JOB B,那么系统会用JOB A的*LDA的内容来初始化JOB B的*LDA。
因为*LDA是私有的,不用担心其他job会锁住LDA,所以LDA的读取和更新不用上锁,也不会报错。
D Local             DS            DTAARA(*LDA)          //定义*LDA
DorderNum                  5    Overlay(Local:5)
*
C                  IN       Local
C                  EVAL    orderNum=’12345’
C                  OUT   Local
如果Data Area是*LDA的话,不用锁住Data Area,更新Data Area也不会报错,不是*LDA的话,以上代码就会报错。

niuhua77 发表于 2011-09-08 14:27

沙发还是要自己坐滴~~~

Data queue部分还没写,等有时间我写好了会补上的

最近论坛太冷清了,都冒冒泡,加点人气吧~~~~

shibuya 发表于 2011-09-08 16:50

坐等data queue高见

roden 发表于 2011-09-08 20:54

这个确实可比性不大,问这个问题的大概是国人吧。

爱笑的猫猫 发表于 2011-09-08 21:44

不怕有问题,只怕不问问题,再怕问问题没人答,坐下来慢慢看,hoho:em03:

junlee1986 发表于 2011-09-08 23:29

我也来围观一下,,写的不错,支持呀~

niuhua77 发表于 2011-09-09 08:16

回复 3# shibuya


    多谢捧场~~~

niuhua77 发表于 2011-09-09 08:18

回复 4# roden


    前几天朋友说他面试的时候被问到了,好像是国内的公司

niuhua77 发表于 2011-09-09 08:19

回复 5# 爱笑的猫猫


    说的太对了,围观也是一种态度。。。。

niuhua77 发表于 2011-09-09 08:21

回复 6# junlee1986


    我忠实的粉丝,呵呵:$
页: [1] 2
查看完整版本: DATA AREA和DATA QUEUE的区别之我见(一)