发布一个用于Oracle数据库间数据复制的组件-OraSyner
相信现在很多Application在使用db的时候,仍采用master-slave的方式,因为这种方式最贴近现实,开始可能只需要一台db server,可随着数据量的增加,一台会不堪重负,此时我们必须增加server,来应付日益增长的data,而我们在开发程序的时候,可能并没有想到系统日后要面临这样的分布式数据库系统,此时最好的解决方案就是master-slave,这样系统就可以不做任何的更新了。在工作中,我开发了一个用于同步master-slave之间数据的组件,他包括以下功能:
- 能够同步master和slave的数据
- 在同步数据的时候,能够记录运行过程
他的特点是一个通用的组件,他通过配置文件来设置master和slave库,并且通过配置来设置要数据同步的数据表,当有新的数据表需要同步的时候,我们只需要在配置中增加一项就能解决问题。这个配置文件,名称为:OraSyner.cfg,将它放置在程序运行的目录里面。OraSyner.cfg中格式如下:
<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中的
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。