發布一個用于Oracle數據庫間數據復制的組件-OraSyner
相信現在很多Application在使用db的時候,仍采用master-slave的方式,因為這種方式最貼近現實,開始可能只需要一臺db server,可隨著數據量的增加,一臺會不堪重負,此時我們必須增加server,來應付日益增長的data,而我們在開發程序的時候,可能并沒有想到系統日后要面臨這樣的分布式數據庫系統,此時最好的解決方案就是master-slave,這樣系統就可以不做任何的更新了。在工作中,我開發了一個用于同步master-slave之間數據的組件,他包括以下功能:
- 能夠同步master和slave的數據
- 在同步數據的時候,能夠記錄運行過程

他的特點是一個通用的組件,他通過配置文件來設置master和slave庫,并且通過配置來設置要數據同步的數據表,當有新的數據表需要同步的時候,我們只需要在配置中增加一項就能解決問題。這個配置文件,名稱為:OraSyner.cfg,將它放置在程序運行的目錄里面。OraSyner.cfg中格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<cfgs>
<servers>
<master>Password=321;User ID=username;Data Source=masterdb</master>
<slave>Password=123;User ID=username;Data Source=slavedb</slave>
</servers>
<syntables>
<table name="tablename">
<key>key1</key>
<key> key2</key>
</table>
</syntables>
</cfgs>
|
節點名稱 |
使用狀態 |
節點說明 |
|
cfgs |
在整個配置文件中有且只有一個 |
配置文件的根節點 |
|
servers |
在整個配置文件中有且只有一個 |
用于聲明master-salve服務器信息的根節點 |
|
master |
在一個server中有且只有一個 |
Master db的連接字符串 |
|
slave |
在一個server中有且只有一個 |
Salve db 的連接字符串 |
|
syntables |
在整個配置文件中有且只有一個 |
用于聲明待同步的數據表信息的根節點 |
|
table |
在syntables中0個或者多個 |
用于聲明待同步數據表信息的節點 |
|
Table[@name] |
在table節點中有且只有一個的屬性 |
用于指示同步數據表的名稱 |
|
key |
在一個table節點中1個或者多個 |
用于指示待同步數據表的行標志字段 |
該組件的特點:
- 通俗易用,擴展性強,搞明白上面的配置說明就萬事大吉
- 能適用于任何環境之下,比如master在內網,而slave在外網,或者slave在內網,而master在外網,只要運行該組件的主機能連接到master和slave就可以。
該組件的工作原理:
通過讀取配置文件,將要同步的數據表數據讀取出來放到組件的DataSet中,然后針對每個表,先在master中獲取表字典,然后根據配置中的行標志字段,生成用于同步slave的語句,主要采用oracle中的
MERGE INTO
USING ON
WHEN MATCHED then
WHEN NOT MATCHED THEN
語句來實現同步功能,也就是有就更新,沒有則插入,而一條條的 比對,性能會相對比較慢,所以先在slave中創建臨時表,將數據插入到該臨時表,然后一次性merge into.測試后,發現比一條條的快20倍左右。
本組件的適用范圍:
- 發布/訂閱不太方便的時候
- 數據量不宜太大,太大會搞死人的,比如上百萬,上千萬 ,我測試了下,幾萬的數據在幾秒內還是能搞定的。再大了本組件就沒戲了
- 臨時 充當數據同步工具(其實我開發這個就是為了這個目的)
使用辦法:
每次同步操作之需要調用Executor對象的Execute()方法即可,你可以將它加到作業調度軟件中,定時的執行。
注意:產生的log信息會在程序運行的目錄里面的log文件夾中按日期創建類似yyyyMmdd這樣格式的文件夾。而如果想輸出比較詳盡的log信息,在.config中文件的<appSetting>中添加<add key="LogLevel" value="2"/>是必須的,value改為1,它只記錄錯誤和提示信息,為0,只記錄錯誤,為2記錄錯誤,提示和調試信息。
組件項目文件:/Files/jillzhang/OraSyner.rar
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

浙公網安備 33010602011771號