在開發分布式應用程序時
可用性與性能是主要考慮事項
但是用數據存儲解決這些問題可能會給異構數據存儲之間的數據同步帶來一些問題
在本文中
Jayanthi Suryanarayana 和 Neil Tunnicliffe 將提供一種解決方案
用 JDBC 和 SyncML 標准來實現通用的數據庫數據復制
在設計分布式應用程序時
必須考慮可用性與性能
一般的解決方案是在客戶機系統上包含數據存儲
通常
由於資源有限
客戶機需要一個輕量級數據存儲
這種方法為異構數據存儲之間的數據同步帶來了挑戰
這個問題的一種解決方案是采用基於 java 的方法
用 JDBC 和 SyncML 標准進行異構數據庫復制
復制概述
復制是在兩個環境之間復制全部或部分數據庫的過程
為了保持一致
對源數據庫所做的更改要傳播到復制的數據庫中
復制可以是單向的
也可以是雙向的
雙向復制可能更困難一些
因為對任何數據庫所做的更改都可能產生不一致的數據
當這些更改在兩個數據庫之間傳播時
需要有一個策略來調解這些差異
以便維護一致性
ID 處理
作為復制的基本需求
我們需要惟一地標識將要復制的每個數據單元
對於雙向復制
還需要一個能夠標識數據庫之間對應數據單元的映射方案
根據復制的需求
可以采用各種各樣的方案
對於單向復制
主數據庫可以要求為數據單元生成 ID
對於雙向復制
必須根據應用程序的 ID 生成方案定義映射方案
ID 生成方案與映射方案可以是每個數據庫使用的 ID 編號的相互排斥范圍
在這個范圍內
ID 編號是正好匹配的
更復雜的示例中可能包括 ID 生成服務或者特定於數據庫的方案
在這種情況下
必須在數據庫之間維護 ID 的映射
變化檢測 復制過程中的下一步是找出哪些數據單元已經更改
在關系數據庫中
可以用附加字段來記錄數據單元的狀態和狀態變化的時間戳
或者
也可以使用觸發器使部分變化檢測過程自動化
附加到表上的插入/更新/刪除觸發器可以檢測到對數據單元所做的更改
並在更改日志表中記錄這些更改
這樣就可以用變更記錄表(change log table)確定在任何指定時間上對數據單元所做的更改
復制 復制的目標是產生公共數據集的多個一致的副本
為了實現這個目標
必須交換每個數據庫中檢測到的更改
並使它們一致
在這裡
您面臨著一個設計上的挑戰
您可以作出如下選擇
表示將交換的那些更改的數據格式
傳輸機制
例如 HTTP
FTP
JMS 等
取決於應用程序的需求
參與實體之間的交換協議
數據單元之間的沖突檢測和解決機制
SyncML 定義了一個同步協議
使用 XML 消息來添加
刪除和修改數據單元
它也允許交換安全信息
這樣節點就可以執行身份驗證
Sync
J 是 SyncML 的開源 java 實現
它能夠支持多種傳輸機制
Sync
J 也根據應用程序的需求
給出了沖突檢測框架和解決策略
示例實現 本文將介紹一個簡單的數據復制示例
這個示例將演示兩個異構數據庫之間的雙向客戶數據記錄復制
每個數據庫都包含一個結構類似的客戶表
使用惟一的客戶 ID 來標識被復制的每條記錄
我們在表中添加了兩列
以記錄每條記錄的狀態和最後狀態變化時間戳
對於這個示例
狀態與時間戳這兩列必須通過應用程序或手工進行填充
正如前面說過的
觸發器是一種在變更記錄表中自動填充更改數據的適當解決方案
但是
在這個例子中使用的數據庫目前擁有的觸發器能力還很有限
因此我們選擇不用觸發器來實現這項任務
而且
這個實例不包括雙向復制的沖突解決策略
所以沖突會導致復制過程失敗
我們要配置在 Tomcat servlet 容器中運行 Sync
J 服務器的服務器端環境
還要用 Derby 作為源數據庫
此外
還要配置客戶端環境
用 HSQLDB 作為目標數據庫
在上面運行 Sync
J 客戶程序
(在這個例子中
假設已經安裝了 J
SE SDK 和 Ant
)
服務器端安裝 要運行示例應用程序
需要在服務器端安裝三個開源組件
Tomcat
Sync
J 服務器和數據庫引擎
安裝 Tomcat
Sync
J 和 Derby 按以下步驟安裝三個主要的服務器組件(請參閱 參考資料
以獲得下載鏈接)下載並展開 Tomcat
本文中用 TOMCAT 表示 Tomcat 的安裝目錄
將環境變量 J
EE_HOME 設為 TOMCAT
下載並展開 Sync
J Server
本文中用 SYNC
J 表示 Sync
J 服務器的安裝目錄
下載並安裝 Derby
本文中用 DERBY 表示 Derby 的安裝目錄
配置示例應用程序 接下來
需要配置示例代碼
請單擊本文頂部或底部的 Code 圖標來下載j
sync
j
zip
將該文件解壓到包含本示例使用的客戶端代碼
服務器代碼和 SQL 腳本的目錄中
本文中用 TESTSYNC 表示這個目錄
設置 JDBC 驅動程序類路徑 設置 JDBC 驅動程序的類路徑
將 db
jcc
jar 和 db
jcc_license_c
jar 分別從 DERBY\lib 復制到 TOMCAT\common\lib 和 SYNC
J\lib 中
用於 Sync
J 服務器的 Derby 安裝腳本
接下來
將目錄 TESTSYNC\derby 移動到 SYNC
J\default\sql
提供的腳本與 Sync
J 服務器下載一起提供的其他數據庫腳本類似
但是要針對 Derby 對它們稍作修改
構建示例 Sync
J 服務器模塊
要構建示例 Sync
J 服務器模塊
請按以下步驟進行
將 TESTSYNC\module\build
bat 中的 SYNCSERVER_DIR 設置為指向 SYNC
J
運行 TESTSYNC\module\build
bat
配置 Sync
J 服務器
要配置 Sync
J
請按以下步驟進行
在 Derby 中創建叫做 sync
jdb 的數據庫
步驟
的代碼中描述了 JDBC 設置
這些設置假設 DERBY 中有一個叫做 sync
jdb 的數據庫
用戶名為 sync
j
口令為 sync
j
用 Derby 附帶的 IJ 工具創建並設置這個數據庫(有關 Derby 工具的信息
請參閱 參考資料)
設置 the properties in SYNC
J\install
properties 中的屬性
如下所示(用 JDBC 設置中的實際路徑代替 DERBY)
dbms=derby
jdbc
classpath=DERBY/lib/db
jcc
jar;DERBY/lib/db
jcc_license_c
jar;
jdbc
driver=com
ibm
db
jcc
DB
Driver
jdbc
url=jdbc:derby:net://localhost:
/
DERBY/sync
jdb
jdbc
user=sync
j
jdbc
password=sync
j
modules
to
install=foundation
pdi
testsync
設置 Derby 數據庫 執行 DERBY\frameworks\NetworkServer\bin\startNetworkServer
bat
將 Derby 作為網絡服務器來啟動
有關將 Derby 作為網絡服務器啟動的更多信息
請參閱 Derby 的手冊
用 IJ 工具執行 TESTSYNC\create_table_server
sql
在 Derby 數據庫中創建表 customer
為 Tomcat 安裝 Sync
J 服務器和示例模塊要為 Tomcat 服務器安裝 Sync
J 服務器並設置 Sync
J 數據庫
需要完成以下步驟
從 SYNC
J 中運行以下命令
SYNC
J\bin\install
cmd tomcat
當給出命令提示時
按 Y 來重新構建 testsync
模塊的數據庫
從 SYNC
J 中運行 SYNC
J\bin\sync
j
tomcat
cmd
然後啟動 Tomcat 服務器
請注意服務器端設置
現在可以安裝客戶機了
客戶端安裝 需要在客戶端安裝數據庫引擎 HSQLDB
然後安裝並配置示例代碼
設置客戶機應用程序和數據庫要設置客戶機應用程序數據庫
請按下以步驟進行
下載並解壓 HSQL 數據庫
本文中用 HSQLDB 作為 HSQL 數據庫的安裝目錄
將 HSQL 作為網絡服務器啟動
它帶有一個叫做 test 的數據庫
運行 TESTSYNC\create_table_client
sql 在 HSQL 數據庫中創建類似的表(customer
)
將 HSQL JDBC 驅動程序 HSQLDB\lib\hsqldb
jar 復制到 TESTSYNC\client\lib
在 TESTSYNC\client\config\spds\sources\testsync
properties 中設置客戶機的 JDBC 屬性
如下所示
jdbcDriver=org
hsqldb
jdbcDriver
urlConnection=jdbc:hsqldb:hsql://localhost/test
正確地設置用戶名稱和口令
然後
運行 TESTSYNC\client\build
bat 來構建客戶端應用程序
運行客戶機應用程序向 Derby 數據庫中的 customer
表中插入記錄
例如
insert into customer
(userid
password
cl_op_type
clo_op_time)
values (
user
pass
N
CURRENT_TIMESTAMP);
向 HSQL 數據庫中的 customer
表中插入記錄(請確保 userid 的值與 customer
中記錄的值不同)
例如
insert into customer
(userid
password
cl_op_type
clo_op_time)
values (
user
pass
N
CURTIME());
運行 TESTSYNC\client\output\testsync
bat
customer
表現在應當包含剛才插入 customer
表中的記錄
而 customer
表應當包含來自 customer
表的記錄
結束語 在本文中
我們討論了在設計通用數據庫復制解決方案時涉及的一些重要概念和問題
在設計復雜的分布式應用程序時
資源占用少的嵌入式 Java 數據庫的可用為您提供了一個很好的選擇
同時它還允許使用異構數據庫
對於復制過程和相關問題有很好理解
有助於我們改進這類系統的設計
我們鼓勵您擴展這個示例
以便用沖突解決策略來處理雙向復制
並使用記錄更改數據的自動記錄
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25335.html