[转]基于Quartz的高频率同步

      quartz 是一个按照设定的时间规则来调度作业的调度器,比如可以设定每30s启动一个Job,但如果Job在30s内还未完成,那么 quartz 默认情况下还是按照设定的周期启动新的Job线程。
      有这样一个应用场景,两个表结构相同的数据库A和B,A是一个实时交易的业务系统数据库,需要把A中的数据完全准实时的复制到B中。同时,交易表 中存在一个时间戳字段,同步任务是每次按照这个时间戳来作增量同步的,即先在B中select max(col_timestamp)得到当前最大时间戳,再到A中获取大于该时间戳的数据集,最后再insert到B中。
      在该场景下,如果前一个线程还未结束写的动作(比如一共1000条记录,已经提交了500条,还剩500条没提交),而后一个现成又开始读的话, 将导致后500条记录重复插入的异常。实现的代码是完全的JDBC代码,不支持跨数据库级别的事务管理,而Job中第一次读和后面的写是在数据库B中,可 以合并为一个事务(t1),第二次读是针对数据库A,作为一个事务(t2)。为了避免以上的幻读和重复写异常,可以这样作:
(1)将connection的自动提交设为false。
(2)设置事务隔离级别为serialization。事务t1肯定要设置为最高级别serialization的,因为要避免幻读(避免当前一 个线程还在写的时候,后续的线程来读);而事务t2可以不用把隔离级别设为serialization,默认的read commited即可。
(3)每次把当前需要insert的数据作为一次性提交,也就是说第一次的读和后面的写作为一个事务而不是多个。
      这样即时数据量再大,而同步周期再短,数据都能顺利的复制到目标库。
      回过头来看整个流程,其实在数据库级别加serialization隔离级别,就是使得事务能够串行处理。理论上来说,这种效果其实在应用程序层面也是可以做到的,即后面的线程在前面的线程处理完成之后再启动,也就是所谓的状态化线程控制,但 quartz 似乎并不支持这一点。

转自:http://tigers.javaeye.com/blog/162088
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值