有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是一种更有效的存储文件记录的方法

最近在讨论中,我被问到: 您有一个包含许多记录(比如500万条)的平面文件。 您需要编写一个Java程序,该程序可以从该文件中获取记录并将其存储在数据库中(比如通过JDBC)。 最有效的方法是什么

我的建议是创建:

  • 一个线程将处理JDBC连接(另外可以使连接类成为singleton)
  • 另一个线程将从文件中获取记录&;保存在表中
  • 另外,当数据库中保存了一定数量的记录时,比如说100条,然后先提交这些记录,然后继续

在这里存储过程会更好还是有其他方法


共 (2) 个答案

  1. # 1 楼答案

    听起来你的想法是对的

    在网络I/O和DB操作上花费的成本和时间将远远大于在平面文件上花费的文件IO和解析时间。让一个单独的线程读取文件并为数据库准备一个记录可能会有一些小的性能提升,但这可能不值得增加复杂性,也不值得JVM花在线程管理上的时间。我建议:

    • 1个线程读取文件并提交数据库更新
    • 正如bitfiddler所说,对每个记录使用带有批更新(preparedStatement.addBatch())的PreparedStatements,并每“N”个记录提交批(preparedStatement.executeBatch())。您可能想要了解“N”的理想值,但100是一个很好的起点

    我不建议使用存储过程。如果你只是直接插入,它们不会对你有多大帮助

  2. # 2 楼答案

    好问题。使用准备好的语句在这里很重要,因为它将减少每次插入所涉及的开销。您当然不希望它解析“insert into blah…”每一次。我不会担心管理线程来读取文件等等,这就是操作系统为您所做的。只需通过缓冲区读取文件的大块内容,并从中进行插入即可。您可能会考虑通过生成插入器任务的多个实例将文件划分为多个块,这些任务从查找文件并从文件中读取块开始。操作系统应该缓冲读取,这样搜索就不会坏。当然,如果您的数据库不在RAID上或至少不在其他卷上,则所有赌注都将被取消。只是一些想法来搅动锅