程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用SyncML進行異構數據庫復制技巧

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

編輯:關於JAVA

在開發分布式應用程序時,可用性與性能是主要考慮事項。但是用數據存儲解決這些問題可能會給異構數據存儲之間的數據同步帶來一些問題。在本文中,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 消息來添加、刪除和修改數據單元。它也允許交換安全信息,這樣節點就可以執行身份驗證。

Sync4J 是 SyncML 的開源 Java 實現,它能夠支持多種傳輸機制。Sync4J 也根據應用程序的需求,給出了沖突檢測框架和解決策略。

示例實現

本文將介紹一個簡單的數據復制示例。這個示例將演示兩個異構數據庫之間的雙向客戶數據記錄復制,每個數據庫都包含一個結構類似的客戶表。使用惟一的客戶 ID 來標識被復制的每條記錄。我們在表中添加了兩列,以記錄每條記錄的狀態和最後狀態變化時間戳。對於這個示例,狀態與時間戳這兩列必須通過應用程序或手工進行填充。正如前面說過的,觸發器是一種在變更記錄表中自動填充更改數據的適當解決方案。但是,在這個例子中使用的數據庫目前擁有的觸發器能力還很有限,因此我們選擇不用觸發器來實現這項任務。而且,這個實例不包括雙向復制的沖突解決策略。所以沖突會導致復制過程失敗。

我們要配置在 Tomcat servlet 容器中運行 Sync4J 服務器的服務器端環境,還要用 Derby 作為源數據庫。此外,還要配置客戶端環境,用 HSQLDB 作為目標數據庫,在上面運行 Sync4J 客戶程序。(在這個例子中,假設已經安裝了 J2SE SDK 和 Ant。)

服務器端安裝

要運行示例應用程序,需要在服務器端安裝三個開源組件:Tomcat、Sync4J 服務器和數據庫引擎。安裝 Tomcat、Sync4J 和 Derby 按以下步驟安裝三個主要的服務器組件(請參閱 參考資料,以獲得下載鏈接)下載並展開 Tomcat 5.0.29。本文中用 TOMCAT 表示 Tomcat 的安裝目錄。將環境變量 J2EE_HOME 設為 TOMCAT。下載並展開 Sync4J Server 4.0.2。本文中用 SYNC4J 表示 Sync4J 服務器的安裝目錄。下載並安裝 Derby。本文中用 DERBY 表示 Derby 的安裝目錄。

配置示例應用程序

接下來,需要配置示例代碼。請單擊本文頂部或底部的 Code 圖標來下載j-sync4j.zip。將該文件解壓到包含本示例使用的客戶端代碼、服務器代碼和 SQL 腳本的目錄中。本文中用 TESTSYNC 表示這個目錄。

設置 JDBC 驅動程序類路徑

設置 JDBC 驅動程序的類路徑:將 db2jcc.jar 和 db2jcc_license_c.jar 分別從 DERBYlib 復制到 TOMCATcommonlib 和 SYNC4Jlib 中。用於 Sync4J 服務器的 Derby 安裝腳本,接下來,將目錄 TESTSYNCderby 移動到 SYNC4Jdefaultsql。提供的腳本與 Sync4J 服務器下載一起提供的其他數據庫腳本類似,但是要針對 Derby 對它們稍作修改。構建示例 Sync4J 服務器模塊,要構建示例 Sync4J 服務器模塊,請按以下步驟進行:

將 TESTSYNCmoduleuild.bat 中的 SYNCSERVER_DIR 設置為指向 SYNC4J。

運行 TESTSYNCmoduleuild.bat。

配置 Sync4J 服務器

要配置 Sync4J,請按以下步驟進行:

在 Derby 中創建叫做 sync4jdb 的數據庫。步驟 3 的代碼中描述了 JDBC 設置,這些設置假設 DERBY 中有一個叫做 sync4jdb 的數據庫,用戶名為 sync4j,口令為 sync4j。

用 Derby 附帶的 IJ 工具創建並設置這個數據庫(有關 Derby 工具的信息,請參閱 參考資料)。

設置 the properties in SYNC4Jinstall.propertIEs 中的屬性,如下所示(用 JDBC 設置中的實際路徑代替 DERBY):

dbms=derby

jdbc.classpath=DERBY/lib/db2jcc.jar;DERBY/lib/db2jcc_license_c.jar;

jdbc.driver=com.ibm.db2.jcc.DB2Driver

jdbc.url=jdbc:derby:net://localhost:1527/"DERBY/sync4jdb"

jdbc.user=sync4j

jdbc.passWord=sync4j

modules-to-install=foundation-1.0,pdi-1.1,testsync-1.0

設置 Derby 數據庫

執行 DERBYframeworksNetworkServerinstartNetworkServer.bat,將 Derby 作為網絡服務器來啟動。有關將 Derby 作為網絡服務器啟動的更多信息,請參閱 Derby 的手冊。用 IJ 工具執行 TESTSYNCcreate_table_server.sql,在 Derby 數據庫中創建表 customer1。為 Tomcat 安裝 Sync4J 服務器和示例模塊要為 Tomcat 服務器安裝 Sync4J 服務器並設置 Sync4J 數據庫,需要完成以下步驟:

從 SYNC4J 中運行以下命令:SYNC4Jininstall.cmd tomcat。當給出命令提示時,按 Y 來重新構建 testsync-1.0 模塊的數據庫。從 SYNC4J 中運行 SYNC4Jinsync4j-tomcat.cmd,然後啟動 Tomcat 服務器。請注意服務器端設置;現在可以安裝客戶機了。

客戶端安裝

需要在客戶端安裝數據庫引擎 HSQLDB。然後安裝並配置示例代碼。設置客戶機應用程序和數據庫要設置客戶機應用程序數據庫,請按下以步驟進行:

下載並解壓 HSQL 數據庫。本文中用 HSQLDB 作為 HSQL 數據庫的安裝目錄。將 HSQL 作為網絡服務器啟動,它帶有一個叫做 test 的數據庫。運行 TESTSYNCcreate_table_clIEnt.sql 在 HSQL 數據庫中創建類似的表(customer2)。將 HSQL JDBC 驅動程序 HSQLDBlibhsqldb.jar 復制到 TESTSYNCclientlib。在 TESTSYNCclientconfigspdssourcesestsync.propertIEs 中設置客戶機的 JDBC 屬性,如下所示:

jdbcDriver=org.hsqldb.jdbcDriver

urlConnection=jdbc:hsqldb:hsql://localhost/test

正確地設置用戶名稱和口令。然後,運行 TESTSYNCclIEntuild.bat 來構建客戶端應用程序。運行客戶機應用程序向 Derby 數據庫中的 customer1 表中插入記錄。例如:

insert into customer1 (userid, passWord, cl_op_type, clo_op_time)

values ("user1", "pass1", "N", CURRENT_TIMESTAMP);

向 HSQL 數據庫中的 customer2 表中插入記錄(請確保 userid 的值與 customer1 中記錄的值不同)。例如:

insert into customer2 (userid, passWord, cl_op_type, clo_op_time)

values ("user2", "pass2", "N", CURTIME());

運行 TESTSYNCclIEntoutputestsync.bat。customer1 表現在應當包含剛才插入 customer2 表中的記錄,而 customer2 表應當包含來自 customer1 表的記錄。

結束語

在本文中,我們討論了在設計通用數據庫復制解決方案時涉及的一些重要概念和問題。在設計復雜的分布式應用程序時,資源占用少的嵌入式 Java 數據庫的可用為您提供了一個很好的選擇,同時它還允許使用異構數據庫。對於復制過程和相關問題有很好理解,有助於我們改進這類系統的設計。我們鼓勵您擴展這個示例,以便用沖突解決策略來處理雙向復制,並使用記錄更改數據的自動記錄。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved