【问题标题】:how to properly insert data to database from txt file [closed]如何正确地将数据从 txt 文件插入数据库 [关闭]
【发布时间】:2014-02-18 20:47:22
【问题描述】:

简单的问题:任何想法应该如何正确完成?我有 3 个包含大量信息的 txt 文件,我创建了一个类,负责从 txt 文件中读取数据并将数据作为 DTO 组件列表返回(是的,信息可以作为这样的逻辑单元捆绑) ,取决于 txt 文件,之后客户端将使用 DAO 并将使用这样的列表并将数据插入本地数据库(sqlite)。我担心拥有这样的列表可能需要内存,我是否应该避免使用这样的列表并以某种方式直接使用 dao 对象插入这些数据而不将数据捆绑到 dto 和最后的列表中?

【问题讨论】:

  • 您的文件有多大?如果它们太大而无法放入内存,那么您将不得不分块处理它们。
  • 尝试过吗?听起来您正在尝试执行优化,甚至没有采取“幼稚”的方法。有时候,天真就足够了。如果您已经尝试过并确定它太慢或对客户端计算机要求很高,请发布一些代码。

标签: java jdbc dao dto


【解决方案1】:

您提出了一个很好的问题并自己回答了部分问题。 是的,如果你真的有很多信息,你不应该从文件中读取所有信息,然后将其存储在数据库中。您应该逐块读取信息,或者即使可以(从应用程序的角度)逐行读取,并且将每一行存储为 DB。

在这种情况下,您在任何时候都只需要一行内存。

您可以按如下方式设计应用程序。

  • 返回Iterable<Row>的文件解析器
  • 接受 Iterable<Row> 并将行存储在 DB 中的 DB 写入器,
  • 调用两者的管理器。

在这种情况下,负责读写文件的逻辑将被封装到某些模块中,不需要额外的内存消耗。

【讨论】:

  • 我正在考虑使用我的 DAO 作为我的“经理”,因为他们会“在 DB 中存储行”(在我的第一种方法中,行实际上是 DTO),是否与您的建议相同?
  • 不,不是,我又读了一遍,现在我明白了,对不起,我不能给你投票,不过非常感谢。
【解决方案2】:

不返回列表,而是像本例中这样的迭代器:Iterating over the content of a text file line by line - is there a best practice? (vs. PMD's AssignmentInOperand)

您必须修改此迭代器以返回您的 DTO 而不是 String:

for(MyDTO line : new BufferedReaderIterator(br)){
    // do some work
}

现在您将逐行遍历文件,但您将返回 DTO 而不是返回行。这种解决方案对内存的影响很小。

【讨论】:

  • 我在想同样的方法,我会让我的客户创建一些对象或使用某种方法来创建这样的循环,最终通过这样的 dto 和我的 dao 的帮助插入数据。我认为会结合使用您的答案和 AlexR 的对不起,我不能投票给您。
  • 我没有看到第一个答案 - 它一定是并行发布的。至少两个想法是一样的。
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2013-08-05
相关资源
最近更新 更多