2016-07-07 57 views
1

我有一个每天读文件并将数据插入oracle和couchbase的spring批处理。还有其他应用程序从这些数据源读取数据,为此我只需要表中的最新记录数据。我如何维护oracle和couchbase中的数据快照

让我们举一个例子 1天:我收到与下面记录的文件

123,student1,gradeA (id,name,grade) 
124, student2, gradeA (id, name, grade) 

第2天:我收到了文件,下面记录

123,student1,gradeB (id,name,grade) 

所以我需要做的是

1. on Day1 I should insert all the records of the file as initially table is empty 
2. On Day2 I need to invalidate the record for "124" as that is not in file 
3. On Day2 Update the record for "123" with new grade 

所以在第2天,如果任何读取请求来“124”我应该t徘徊异常(数据未找到)。

夫妇的做法我想过

Approach 1: 

我可以在表中,每天一个文件 读我得到的唯一版本号那一天,一个版本号列,而 插入记录到当天的数据库中,我使用版本号。但 为此,我需要在其他地方存储修订号码,并且每次需要读取数据时,我必须执行额外的查找以获取 当前版本号。

Approach2: 

每次记录更新维护批处理它永远不会被修改删除这些记录后LAST_MODIFIED_DATE柱和 (这 可能是昂贵的)。

上述方法可能适用于oracle,但对于couchbase,我正在考虑为每个记录使用TTL来解决此问题。

有人可以提出任何其他更好的方法吗?

回答

0

我会小心Couchbase中的TTL。如果您的批处理计划延迟,您将丢失所有数据。

方法2对我来说似乎是最干净的,您可以在Oracle和Couchbase中使用合并/上插来相应地插入/更新。在Oracle中,您需要物理或临时登台表来提高MERGE的性能。而对于Couchbase,你会使用批量UPSERT

0

您可以使用标志来维护记录验证。
每天所有记录都将被标记为“无效”,并且在批处理过程中如果缺失则添加记录,或者如果记录已存在,则将记录标记为“有效”。