【问题标题】:Differential load a file into database将文件差异加载到数据库中
【发布时间】:2013-01-07 03:19:39
【问题描述】:

我正在寻找 java 或数据库中以下问题的解决方案。请帮忙。

我们必须读取一个文件并将记录放入 oracle 数据库中。文件就像 FTP 位置的 csv 格式(列值用管道 | 分隔)。假设文件名是employee.txt,对应的表名是Employee。假设列为 -

ID
name
Designation
Date_of_Joining  

txt 文件中的记录将是 -

1234|saurabh srivastava|lead|06-0ct-1990
1235|a john|lead|09-nov-1992
1236|p kumar||10-dec-1991

该文件将始终包含完整记录。意思是,如果第一次文件有 10 条记录,下一次它将有这 10 条记录以及新记录。但是每次我们只需要在数据库中存储新记录。有没有什么办法使用java程序或Databse(过程,查询等),考虑到更少的性能损失。

谢谢。

【问题讨论】:

  • 新记录是总是在文件的末尾还是可以混合在不同的位置。
  • 创建文件实际上是从数据库导出。不知道每次它会如何放置记录。
  • 值得测试,但我猜它会按主键顺序排列,所以如果你的键是一个自动递增字段,它总是在底部有最新的。那么另一个问题可能是,如果一条记录从一个文本版本修改为另一个版本。这会很糟糕,但您可能必须截断表格并从文本文件中恢复,以确保您将所有内容都恢复到备份时的状态。

标签: java database


【解决方案1】:

您最好的选择可能是混合方法。假设没有其他任何东西修改您可以在最后一行读取的数据库中存储的文件。然后你的java程序可以打开文件,从数据库中获取最后一行(或具有最后读取行号的另一个文件)跳到下一行(假设它存在),然后开始解析/将值插入到数据库中。我不认为仅数据库方法对您有好处,因为您会将所有解析处理(假设它甚至可能)放到您的服务器上,而不是能够将其解耦到客户端或另一个“日志”该部分的服务器。

无论哪种方式,您都需要以某种方式持久读取最后一行,否则您最终将不得不每次都处理整个文件,然后只插入不存在的任何内容,这两者都不会有效并且需要越来越长的时间随着时间的推移。

【讨论】:

  • 坏消息 :(。新记录不必在文件末尾。可以采用以下结构: 文件 1:记录 A 记录 B 记录 C 文件 2:记录 A,记录 C 记录D 因此,文件 2 可能根本没有记录 B,可能是某个员工不再可用等。
  • 如果是这种情况,我们必须依赖组合键,而高级设计将是这样的——1.我们将维护两个表——a。 Employee 和 Employee_tmp 2. 读取文件并将所有内容存储在 Employee_tmp 3. 如果 Employee 表为空,则将所有记录从 Employee_tmp 复制到 Employee 表 4. 清理 Employee_tmp 表 5. 下一次迭代 6. 读取文件并将所有内容存储在 Employee_tmp 7. 如果行那么 Employee_tmp 表中的计数大于零
  • 开始匹配记录如下[还要分析是否需要在java或数据库中编写程序,查询可以这样做] - a.从 Employee_tmp 表中选择键 [Employee ID)] b。检查他们是否已经在 Employee 表中。如果是,则跳到下一条记录,否则插入记录。请提出建议。
猜你喜欢
  • 2013-01-19
  • 2020-10-30
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多