熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

用SyncML進行異構數據庫復制技巧

2013-11-23 17:54:48  來源: Javascript 

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

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.