2

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

我的建议是创建:

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

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

4

2 回答 2

2

听起来你有正确的方法。

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

  • 1 个线程读取文件并提交数据库更新。
  • 正如 bitfiddler 所说,对每条记录使用带有批处理更新 () 的 PreparedStatements ,并在每“N”条记录preparedStatement.addBatch()中提交批处理 ( )。preparedStatement.executeBatch()您可能希望创建原型以查看“N”的理想值是多少,但 100 是一个不错的起点。

我不推荐存储过程。如果您只是直接插入,它们不会为您做太多事情。

于 2013-07-11T06:02:40.007 回答
0

好问题。在这里使用准备好的语句很重要,因为它将减少每次插入所涉及的开销。您当然不希望它每次都解析“插入等等”。我不会担心管理线程来读取文件等等,这就是操作系统为你做的事情。只需通过缓冲区读取文件的大块并从中插入。您可能会考虑通过生成多个插入器任务实例来将文件分成块,这些插入器任务从寻找文件开始并从那里读取块。操作系统应该缓冲读取,因此搜索不会很糟糕。当然,如果您的数据库不在 RAID 或至少另一个卷上,那么所有的赌注都没有了。只是想搅拌一下锅……

于 2013-07-11T05:24:57.170 回答