三單元 數據管理
第三部分 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…