三单元 数据管理
第三部分 TDQ/TSQ
关于本部分
在TXSeries中,有两种类型的队列——TDQ(暂存数据队列)和TSQ(临时存储队列),在其中可以存储数据并以先进先出的顺序读取数据,也可以通过索引直接读取。不同于使用文件存储数据,队列用于在交易间传递数据,甚至是在不同region的交易之间。队列可以将信息记录到纯文本,而代替并不被推荐的”fprintf“。
本部分将介绍TDQ和TSQ,并将其进行对比,还会讲解如何使用APIs去读取、写入和删除队列。
参阅:
关于队列:
1. TDQ介绍
TDQ以先进先出的顺序管理,无论何时从TDQ中读取记录,这条记录将会被删除,记录的指针总会指向队列中第一个(最旧的)记录。换句话说,TDQ中的数据只能被读取一次。应用程序在使用任何APIs管理TDQ之前, 必须在TDD类型中定义TDQ。根据不同的存储目的,可以分为intrapartition TDQ和extrapartition TDQ。
(1)intrapartition TDQ
在文件管理器(例如SFS)中进行管理,属于指定的region。用于在同一region中的不同交易间传递数据。Intrapartition TDQ可以预定义一个触发器和交易,当触发条件达到时这个交易会自动启动。
(2)extrapartition TDQ
在任何文件系统中进行管理,例如操作系统中的文本文档。用于在不同region或不同设备的交易间传递数据,记录日志数据、统计数据和错误信息。Extrapartition TDQ不能被删除。
参阅:
关于TDQ:
关于intrapartition TDQ:
关于extrapartition TDQ:
2. TSQ介绍
不同于TDQ,TSQ中的记录可以被多次读取和更新 。记录是顺序存储在队列中的,可以通过指定索引来检索任何数据。TSQ会在第一次写入队列时自动被创建,所以不需要在region中预定义TSQ。TSQ也有两种类型,一种是auxiliary TSQ,是存储于文件管理器中的文件,当数据需要长久存储时使用。另一个是main TSQ,存储于内存,当少量数据需要短期存储时使用。
参阅:
3. TDQ和TSQ的区别
下表中是TDQ和TSQ的主要区别:
TDQ |
TSQ |
在被应用程序使用前,TDQ必须在TDD中定义。 |
当第一条WRITEQ命令执行时TSQ被创建 |
记录必须顺序读取,且每条记录只能被读取一次 |
如果没有明确使用命令进行删除,数据和队列的生命周期一致 |
因为只能被读取一次,所以记录不能更改 |
记录可以更改 |
只存储在文件中 |
存储在内存或辅存 |
可以在物理上和逻辑上被恢复 |
只有辅存的队列可以被恢复 |
在intra和extra partition之间可以方便的进行切换,只需要修改TDD stanza而不必修改应用程序 |
不支持 |
4. TDQ的APIs
现在是时候学习操作队列的APIs了。用户可以通过APIs来对TDQ进行写入、读取和删除的操作。但是要注意,在编程之前要定义一个TDD。
(1)添加TDD定义
这里只介绍用户所需要的最简单的选项。TDD必须在region启动之前定义。
a. intrapartition TDQ
语法
cicsadd -c tdd -r <regionName> <TDD entry> DestType=intrapartition RSLKey=public
TriggerLevel=<triggerLevel> TriggeredTransId=<triggeredTransId>
选项
<triggerLevel>: triggerLevel的范围是0到32767。只对intrapartition TDQ有效。
<triggeredTransId> : 指定一个当triggerLevel达到时被触发的交易。只对intrapartition TDQ有效。
b. extrapartition TDQ
语法
cicsadd -c tdd -r <regionName> <TDD entry> DestType=extrapartition RSLKey=public
ExtrapartitionFile=”<extrapartitionFilePath>” RecordType=<recordType> IOMode=<output/input>
选项
<extrapartitionFileName> : extrapartition文件的路径和名称。如果只指定了名称,文件会在”/var/cics_regions/<regionName>/data“目录下。
<recordType> : 指定extrapartition文件的格式,包括fixed_length、variable_length、line_oriented、null_terminated和byte_terminated。fixed_length是默认的,但是推荐使用variable_length。如果指定了fixed_length,同时也应该指定RecordLen。
<output/input>: 指定extrapartition文件是只能写入(output,向这个文件写入)还是只能读取(input,从这个文件读取)。”output“是默认值。
参阅:
(2)向TDQ写入
通过使用WRITEQ TD命令,数据会被追加到TDQ的末尾。对于extrapartition TDQ,一条记录会被追加到extrapartition文件的末尾。
语法
WRITEQ TD QUEUE(“<TDD entry>”) FROM(<dataSet>)
LENGTH(<lengthVariable>)
选项
<TDD entry> : 步骤1添加的TDD。
<dataSet>: 写入TDQ的数据。例如,一个字符集”data“(char data[200])。
<lengthVariable>: 指定数据长度的变量。如果正在写入intrapartition TDQ(只适用C程序)或者没有使用fixed_length的extrapartition TDQ,这个选项必须存在。
如果在TDD中定义了TriggerLevel和TriggeredTransId,例如TriggerLevel=4,TriggeredTransId=“ABCD“。那么当向TDQ写入第4次后(包括4次),当WRITED TD执行时交易ABCD会被触发。
注意,在使用WRITEQ TD命令之前,必须为extrapartition TDQ的TDD定义指定IOMode=output(或使用默认值)。
参阅:
(3)从 TDQ读取
READQ TD命令从TDQ的头部读取记录,每个记录只能被读取一次——当被读取后记录会从队列中移除。
语法
READQ TD QUEUE(“<TDD entry>”) INTO(<dataSet>) LENGTH(<lengthVariable>)
选项
<dataSet> : 存储从TDQ读取的数据。
<lengthVariable> : 当从intrapartition TDQ或者没有使用fixed_length的extrapartition TDQ读取数据时,必须指定这个选项。谨慎地设置这个变量的值,否则可能会收到LENGERR。
注意,在使用READQ TD命令之前,必须为extrapartition TDQ的TDD定义指定IOMode=input。
参阅:
(4)删除TDQ
只能对intrapartition TDQ使用命令进行删除,对于 extrapartition TDQ不适用。
语法
DELETEQ TD QUEUE(“<TDD entry>”)
以下文章点击率最高
Loading…