我有一个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”,我应该抛出异常(未找到数据)。
我想到的几种方法
Approach 1:
我可以在表格中有一个修订号列,每天都有一个文件 读取我获得当天和时间的唯一修订号 在那天将记录插入数据库我使用修订号。但 为此,我需要将修订号存储在其他地方和每个地方 时间我需要读取数据我必须做一个额外的查找才能获得 当前版本号。
Approach2:
每次更新记录时都要保留last_modified_date列和 批量运行后,没有修改删除那些记录(这 可能代价高昂。)
上述方法可能适用于oracle,但对于couchbase,我想为每条记录都有TTL来解决这个问题。
有人可以就此建议任何其他更好的方法吗?
答案 0 :(得分:0)
您可以使用标记来保持记录验证 每天所有记录都会被标记为“无效”。并且在批处理过程中添加记录(如果缺失或标记记录为“有效”'如果它已经存在。
答案 1 :(得分:0)
我对Couchbase中的TTL持谨慎态度。如果您的批处理计划延迟,您将丢失所有数据。
方法2对我来说似乎最干净,您可以利用Oracle和Couchbase中的merge / upsert相应地插入/更新。在Oracle中,您需要物理或临时临时表来提高UPSERT
性能。对于Couchbase,您可以使用批量test_algo
。