用SyncML進(jìn)行異構(gòu)數(shù)據(jù)庫復(fù)制
在開發(fā)分布式應(yīng)用程序時,可用性與性能是主要考慮事項(xiàng)。但是用數(shù)據(jù)存儲解決這些問題可能會給異構(gòu)數(shù)據(jù)存儲之間的數(shù)據(jù)同步帶來一些問題。在本文中,Jayanthi Suryanarayana 和 Neil Tunnicliffe 將提供一種解決方案:用 JDBC 和 SyncML 標(biāo)準(zhǔn)來實(shí)現(xiàn)通用的數(shù)據(jù)庫數(shù)據(jù)復(fù)制。
復(fù)制概述
復(fù)制是在兩個環(huán)境之間復(fù)制全部或部分?jǐn)?shù)據(jù)庫的過程。為了保持一致,對源數(shù)據(jù)庫所做的更改要傳播到復(fù)制的數(shù)據(jù)庫中。復(fù)制可以是單向的,也可以是雙向的。雙向復(fù)制可能更困難一些,因?yàn)閷θ魏螖?shù)據(jù)庫所做的更改都可能產(chǎn)生不一致的數(shù)據(jù)。當(dāng)這些更改在兩個數(shù)據(jù)庫之間傳播時,需要有一個策略來調(diào)解這些差異,以便維護(hù)一致性。
ID 處理
變化檢測
復(fù)制過程中的下一步是找出哪些數(shù)據(jù)單元已經(jīng)更改。在關(guān)系數(shù)據(jù)庫中,可以用附加字段來記錄數(shù)據(jù)單元的狀態(tài)和狀態(tài)變化的時間戳。或者,也可以使用觸發(fā)器使部分變化檢測過程自動化。附加到表上的插入/更新/刪除觸發(fā)器可以檢測到對數(shù)據(jù)單元所做的更改,并在更改日志表中記錄這些更改。這樣就可以用變更記錄表(change log table)確定在任何指定時間上對數(shù)據(jù)單元所做的更改。
復(fù)制
復(fù)制的目標(biāo)是產(chǎn)生公共數(shù)據(jù)集的多個一致的副本。為了實(shí)現(xiàn)這個目標(biāo),必須交換每個數(shù)據(jù)庫中檢測到的更改,并使它們一致。在這里,您面臨著一個設(shè)計(jì)上的挑戰(zhàn)。您可以作出如下選擇:
表示將交換的那些更改的數(shù)據(jù)格式。
傳輸機(jī)制,例如 HTTP、FTP、JMS 等,取決于應(yīng)用程序的需求。
參與實(shí)體之間的交換協(xié)議。
數(shù)據(jù)單元之間的沖突檢測和解決機(jī)制。
SyncML 定義了一個同步協(xié)議,使用 XML 消息來添加、刪除和修改數(shù)據(jù)單元。它也允許交換安全信息,這樣節(jié)點(diǎn)就可以執(zhí)行身份驗(yàn)證。
Sync4J 是 SyncML 的開源 java 實(shí)現(xiàn),它能夠支持多種傳輸機(jī)制。Sync4J 也根據(jù)應(yīng)用程序的需求,給出了沖突檢測框架和解決策略。
示例實(shí)現(xiàn)
本文將介紹一個簡單的數(shù)據(jù)復(fù)制示例。這個示例將演示兩個異構(gòu)數(shù)據(jù)庫之間的雙向客戶數(shù)據(jù)記錄復(fù)制,每個數(shù)據(jù)庫都包含一個結(jié)構(gòu)類似的客戶表。使用惟一的客戶 ID 來標(biāo)識被復(fù)制的每條記錄。我們在表中添加了兩列,以記錄每條記錄的狀態(tài)和最后狀態(tài)變化時間戳。對于這個示例,狀態(tài)與時間戳這兩列必須通過應(yīng)用程序或手工進(jìn)行填充。正如前面說過的,觸發(fā)器是一種在變更記錄表中自動填充更改數(shù)據(jù)的適當(dāng)解決方案。但是,在這個例子中使用的數(shù)據(jù)庫目前擁有的觸發(fā)器能力還很有限,因此我們選擇不用觸發(fā)器來實(shí)現(xiàn)這項(xiàng)任務(wù)。而且,這個實(shí)例不包括雙向復(fù)制的沖突解決策略。所以沖突會導(dǎo)致復(fù)制過程失敗。
我們要配置在 Tomcat servlet 容器中運(yùn)行 Sync4J 服務(wù)器的服務(wù)器端環(huán)境,還要用 Derby 作為源數(shù)據(jù)庫。此外,還要配置客戶端環(huán)境,用 HSQLDB 作為目標(biāo)數(shù)據(jù)庫,在上面運(yùn)行 Sync4J 客戶程序。(在這個例子中,假設(shè)已經(jīng)安裝了 J2SE SDK 和 Ant。)
服務(wù)器端安裝
要運(yùn)行示例應(yīng)用程序,需要在服務(wù)器端安裝三個開源組件:Tomcat、Sync4J 服務(wù)器和數(shù)據(jù)庫引擎。安裝 Tomcat、Sync4J 和 Derby 按以下步驟安裝三個主要的服務(wù)器組件(請參閱 參考資料,以獲得下載鏈接)下載并展開 Tomcat 5.0.29。本文中用 TOMCAT 表示 Tomcat 的安裝目錄。將環(huán)境變量 J2EE_HOME 設(shè)為 TOMCAT。下載并展開 Sync4J Server 4.0.2。本文中用 SYNC4J 表示 Sync4J 服務(wù)器的安裝目錄。下載并安裝 Derby。本文中用 DERBY 表示 Derby 的安裝目錄。
配置示例應(yīng)用程序
接下來,需要配置示例代碼。請單擊本文頂部或底部的 Code 圖標(biāo)來下載j-sync4j.zip。將該文件解壓到包含本示例使用的客戶端代碼、服務(wù)器代碼和 SQL 腳本的目錄中。本文中用 TESTSYNC 表示這個目錄。
設(shè)置 JDBC 驅(qū)動程序類路徑
設(shè)置 JDBC 驅(qū)動程序的類路徑:將 db2jcc.jar 和 db2jcc_license_c.jar 分別從 DERBY\lib 復(fù)制到 TOMCAT\common\lib 和 SYNC4J\lib 中。用于 Sync4J 服務(wù)器的 Derby 安裝腳本,接下來,將目錄 TESTSYNC\derby 移動到 SYNC4J\default\sql。提供的腳本與 Sync4J 服務(wù)器下載一起提供的其他數(shù)據(jù)庫腳本類似,但是要針對 Derby 對它們稍作修改。構(gòu)建示例 Sync4J 服務(wù)器模塊,要構(gòu)建示例 Sync4J 服務(wù)器模塊,請按以下步驟進(jìn)行:
將 TESTSYNC\module\build.bat 中的 SYNCSERVER_DIR 設(shè)置為指向 SYNC4J。
運(yùn)行 TESTSYNC\module\build.bat。
配置 Sync4J 服務(wù)器
要配置 Sync4J,請按以下步驟進(jìn)行:
在 Derby 中創(chuàng)建叫做 sync4jdb 的數(shù)據(jù)庫。步驟 3 的代碼中描述了 JDBC 設(shè)置,這些設(shè)置假設(shè) DERBY 中有一個叫做 sync4jdb 的數(shù)據(jù)庫,用戶名為 sync4j,口令為 sync4j。
用 Derby 附帶的 IJ 工具創(chuàng)建并設(shè)置這個數(shù)據(jù)庫(有關(guān) Derby 工具的信息,請參閱 參考資料)。
設(shè)置 the properties in SYNC4J\install.properties 中的屬性,如下所示(用 JDBC 設(shè)置中的實(shí)際路徑代替 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 |
設(shè)置 Derby 數(shù)據(jù)庫
執(zhí)行 DERBY\frameworks\NetworkServer\bin\startNetworkServer.bat,將 Derby 作為網(wǎng)絡(luò)服務(wù)器來啟動。有關(guān)將 Derby 作為網(wǎng)絡(luò)服務(wù)器啟動的更多信息,請參閱 Derby 的手冊。用 IJ 工具執(zhí)行 TESTSYNC\create_table_server.sql,在 Derby 數(shù)據(jù)庫中創(chuàng)建表 customer1。為 Tomcat 安裝 Sync4J 服務(wù)器和示例模塊要為 Tomcat 服務(wù)器安裝 Sync4J 服務(wù)器并設(shè)置 Sync4J 數(shù)據(jù)庫,需要完成以下步驟:
從 SYNC4J 中運(yùn)行以下命令:SYNC4J\bin\install.cmd tomcat。當(dāng)給出命令提示時,按 Y 來重新構(gòu)建 testsync-1.0 模塊的數(shù)據(jù)庫。從 SYNC4J 中運(yùn)行 SYNC4J\bin\sync4j-tomcat.cmd,然后啟動 Tomcat 服務(wù)器。請注意服務(wù)器端設(shè)置;現(xiàn)在可以安裝客戶機(jī)了。
客戶端安裝
需要在客戶端安裝數(shù)據(jù)庫引擎 HSQLDB。然后安裝并配置示例代碼。設(shè)置客戶機(jī)應(yīng)用程序和數(shù)據(jù)庫要設(shè)置客戶機(jī)應(yīng)用程序數(shù)據(jù)庫,請按下以步驟進(jìn)行:
下載并解壓 HSQL 數(shù)據(jù)庫。本文中用 HSQLDB 作為 HSQL 數(shù)據(jù)庫的安裝目錄。將 HSQL 作為網(wǎng)絡(luò)服務(wù)器啟動,它帶有一個叫做 test 的數(shù)據(jù)庫。運(yùn)行 TESTSYNC\create_table_client.sql 在 HSQL 數(shù)據(jù)庫中創(chuàng)建類似的表(customer2)。將 HSQL JDBC 驅(qū)動程序 HSQLDB\lib\hsqldb.jar 復(fù)制到 TESTSYNC\client\lib。在 TESTSYNC\client\config\spds\sources\testsync.properties 中設(shè)置客戶機(jī)的 JDBC 屬性,如下所示:
| jdbcDriver=org.hsqldb.jdbcDriver urlConnection=jdbc:hsqldb:hsql://localhost/test |
正確地設(shè)置用戶名稱和口令。然后,運(yùn)行 TESTSYNC\client\build.bat 來構(gòu)建客戶端應(yīng)用程序。運(yùn)行客戶機(jī)應(yīng)用程序向 Derby 數(shù)據(jù)庫中的 customer1 表中插入記錄。例如:
| insert into customer1 (userid, password, cl_op_type, clo_op_time) values ('user1', 'pass1', 'N', CURRENT_TIMESTAMP); |
向 HSQL 數(shù)據(jù)庫中的 customer2 表中插入記錄(請確保 userid 的值與 customer1 中記錄的值不同)。例如:
| insert into customer2 (userid, password, cl_op_type, clo_op_time) values ('user2', 'pass2', 'N', CURTIME()); |
運(yùn)行 TESTSYNC\client\output\testsync.bat。customer1 表現(xiàn)在應(yīng)當(dāng)包含剛才插入 customer2 表中的記錄,而 customer2 表應(yīng)當(dāng)包含來自 customer1 表的記錄。
結(jié)束語
在本文中,我們討論了在設(shè)計(jì)通用數(shù)據(jù)庫復(fù)制解決方案時涉及的一些重要概念和問題。在設(shè)計(jì)復(fù)雜的分布式應(yīng)用程序時,資源占用少的嵌入式 Java 數(shù)據(jù)庫的可用為您提供了一個很好的選擇,同時它還允許使用異構(gòu)數(shù)據(jù)庫。對于復(fù)制過程和相關(guān)問題有很好理解,有助于我們改進(jìn)這類系統(tǒng)的設(shè)計(jì)。我們鼓勵您擴(kuò)展這個示例,以便用沖突解決策略來處理雙向復(fù)制,并使用記錄更改數(shù)據(jù)的自動記錄。
出處:http://mjgforever.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明。
posted on 2009-01-06 10:15 mjgforever 閱讀(653) 評論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號