设立一个Job,每10分钟从数据源抓一次数据处理并更新自己的表格。例如当11分时执行,抓0分到10分Edit的数据,21分执行抓10分到20分Edit的数据。

抓取的判断标志是一个Edit_Date的列(记录该列的编辑时间) 大于 begin_date 小于 end_date。

  这样做会产生一些问题。首先数据源的列一直在更新,而我们要抓取0分到10分有更新过的所有列,就不能延迟到11分再执行。因为某一列在7分更新了,又在10分50秒更新了,那么11分执行Job抓数据时,这条数据的Edit_Date就是 10分50秒大于end_date 10分零秒,就会被漏掉。

  那么不设定end_date可以么?显然不设定的话就是抓到了 0分 到11分的数据不符合要求。

  那么10分的时候执行不就可以了么?确实,因为Oracle的读一致性的特性,10分的时候执行一段sql,取到的的确是10分这个点的一版数据。但是如果这个Job里面包含多段sql,第一段sql似乎没有问题,因为是串行执行的,第二段sql执行时,时间已经过了10分这个点,所以数据还是不准确的。

  那么每一个Job里面只有一段sql不就可以了?当然,但是对于有关联的若干更新,显然需要若干sql完成。

  那么要怎样解决呢?可以考虑使用cursor,在某一时刻open的cursor,查出的就是某一时刻的数据。可以在那个时刻open若干需要的cursor以获取该时刻版本的数据。

  当然具体逻辑还要具体分析,通过合适的方式,只要能够符合要求即可。

posted on 2012-08-17 22:03  SoXLiang  阅读(387)  评论(1编辑  收藏  举报