技术开发 频道

发布一个用于Oracle数据库间数据复制的组件-OraSyner


【IT168技术文档】

  相信现在很多Application在使用db的时候,仍采用master-slave的方式,因为这种方式最贴近现实,开始可能只需要一台db server,可随着数据量的增加,一台会不堪重负,此时我们必须增加server,来应付日益增长的data,而我们在开发程序的时候,可能并没有想到系统日后要面临这样的分布式数据库系统,此时最好的解决方案就是master-slave,这样系统就可以不做任何的更新了。在工作中,我开发了一个用于同步master-slave之间数据的组件,他包括以下功能:

  1. 能够同步master和slave的数据
  2. 在同步数据的时候,能够记录运行过程

  他的特点是一个通用的组件,他通过配置文件来设置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>

  该组件的特点:

  1. 通俗易用,扩展性强,搞明白上面的配置说明就万事大吉
  2. 能适用于任何环境之下,比如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倍左右。

  本组件的适用范围:

  1. 发布/订阅不太方便的时候
  2. 数据量不宜太大,太大会搞死人的,比如上百万,上千万 ,我测试了下,几万的数据在几秒内还是能搞定的。再大了本组件就没戏了
  3. 临时 充当数据同步工具(其实我开发这个就是为了这个目的)

  使用办法:

  每次同步操作之需要调用Executor对象的Execute()方法即可,你可以将它加到作业调度软件中,定时的执行。
  注意:产生的log信息会在程序运行的目录里面的log文件夹中按日期创建类似yyyyMmdd这样格式的文件夹。而如果想输出比较详尽的log信息,在.config中文件的<appSetting>中添加<add key="LogLevel" value="2"/>是必须的,value改为1,它只记录错误和提示信息,为0,只记录错误,为2记录错误,提示和调试信息。
0
相关文章