DB2中分發映射兼容的方法和實現

數據庫版本兼容的問題是很重要的問題,從 DB2 V9.7 開始分發映射(distribution map)從 4096 個條目擴展到了 32768 個條目 ,我們要如何實現分發映射的高低版本的兼容呢?

本文介紹并實現了一種方法,在遇到 db2 低版本時將分發映射數組的副本擴展到和高版本一樣的、包含 32768 個條目的大小,這樣處理之后即可對不同版本做相同的處理,如調用分發數據的 api 進行數據的分發。

開發 DB2 程序的時候,低版本的兼容問題是我們不得不考慮的重要問題之一,你一定希望自己寫的程序對 DB2 的所有版本都是支持的,至少是一些大家常用的 DB2 版本,比如 v9.7 和 v9.5。

在用 DB2 提供的 API 編寫應用數據庫分區功能的程序時,經常會用得到分發映射(distribution map),開發者可以將分發映射數組作為參數然后調用相應的 API 把數據分發到對應的數據庫分區上。對于 V9.7 及以上的版本,這個 API 為 db2GetRowPartNum,其明確指出在調用這個 API 的時候參數中的分發映射必須是包含 SQL_PDB_MAP_SIZE_32K(32768)個條目的數組。現在問題出現了,V9.5 及更早版本的 DB2 數據庫的分發映射只含有 SQL_PDB_MAP_SIZE_4K(4096)個條目,我們要同時支持版本 V9.5 和 V9.7,數據分發要如何實現呢?

或許我們可以對 V9.5 和 V9.7 區別對待,當連接的數據庫為 V9.5 時,調用從 V9.7 開始就不推薦使用的 sqlugrpn API 并傳入 4K 條目的分發映射數組,這個分發成功的一個前提是在調用這個 API 之前將注冊變量 DB2_PMAP_COMPATIBILITY 設為 ON;當 DB2 為 V9.7 時,調用 db2GetRowPartNum 并傳入 32K 條目的分發映射數組。

這當然是一個辦法,但兩個 API 具體參數不同,讓實現這個程序變得復雜;還要判斷 DB2 的版本并分別作出處理。

這個版本兼容問題的另外一種解決辦法就是在遇到低版本的 DB2 的時候,我們將得到的分發映射的副本從 4K 個條目擴展到 32K 個條目。我們知道分發映射中各個數據庫分區的出現是有一定循環規律的,在找到這個規律之后,完全可以正確地擴展。

下面講解分發映射中各個數據庫分區的重復規律和如何通過代碼來擴展分發映射數組。

注:本文只討論建立在多數據庫分區的數據庫的 IBMDEFAULTGROUP 數據庫分區組的情況。本文所介紹的方法和實現的程序所用到的結構,API 等是基于 V9.7 版本的。本文不討論不同機器字節存儲次序不同的問題,即認為是相同的。

分發映射的簡要介紹

在一個多數據庫分區的數據分區組中,分發映射包含多個數據庫分區,并且每個數據庫分區在分發映射中是重復出現的。如果一個數據庫建立在 4 個數據庫分區上, 數據庫分區的編號為 0 到 3,那么這個數據庫的 IBMDEFAULTGROUP 數據庫分區組的分發映射則為(以包含 32K 個條目的分發映射為例):

圖 1. 包含 32K 個條目的分發映射
DB2中分發映射兼容的方法和實現

上圖是包含 32K 個條目的分發映射,可以看出數據庫分區 0 至數據庫分區 3 是重復出現的。當 DB2 的版本是 V9.7 和以上版本的時候,調用 db2GetDistMap API 得到的分發映射的副本就是形如上圖所示的包含 32K 個條目的;而在 DB2 的版本是 V9.5 或更早版本的時候,調用 sqlugtpi API 得到的分發映射副本就只包含前面 4K 個條目。

值得注意的分發映射的“邊界值”

我們經常用 4 個數據庫分區,編號為 0 到 3 來舉例介紹數據庫分區功能或者是分發映射,這樣的情況下,“邊界值”第 4096 個, 第 8192 個和第 16384 個條目是編號為 0 的數據庫分區。但各個數據庫分區是在整個的 32K 個條目的分發映射中循環重復,還是在 4K 個條目的分發映射中循環重復,之后在整個 32K 個條目的分發映射中每 4K 個條目重新循環重復?

換句話說,如果有奇數個、如 3 個數據庫分區,32K 個條目的分發映射是什么樣的,“邊界值”又是怎樣的?

通過連接 V9.7 或更高版本的數據庫,并調用 db2GetDistMap API,我們得到的分發映射副本形如下圖所示:

圖 2. 3 個數據庫分區組成的數據庫分區組的分發映射
DB2中分發映射兼容的方法和實現

從上圖可以看出所有的數據庫分區并不是在整個分發映射以一種循環順序重復出現,因為如果這樣的話,上圖標藍的條目應該沿順前一個條目的順序,出現編號為 1 的數據庫分區而不是編號為 0 的。實際上 32K 個條目的分發映射是每 4K 個條目開始一個新的循環,而 4K 個條目內各個數據庫分區是循環重復出現的。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享