最近在讨论中有人问我: 您有一个平面文件,其中包含许多记录,例如 500 万条。 您需要编写一个 Java 程序,可以从该文件中获取记录并将其存储在数据库中(例如通过 JDBC)。 最有效的方法是什么?
我的建议是创建:
- 一个线程将处理 JDBC 连接(另外还可以使连接类成为单例)
- 另一个线程将从文件中获取记录并保存在表中。
- 此外,当数据库中保存一定数量的记录时,例如 100 条,然后先提交这些记录,然后继续。
这里存储过程会更好还是有其他方法?
最佳答案
听起来您心中有正确的方法。
花在网络 I/O 和数据库操作上的成本和时间将比花在平面文件上的文件 IO 和解析时间大得多。使用单独的线程读取文件并为数据库准备记录可能会带来一些小的性能提升,但可能不值得增加复杂性,并且可能不值得 JVM 在线程管理上花费时间。我建议:
- 1 个线程读取文件并提交数据库更新。
- 正如 bitfiddler 所说,对每条记录使用带有批量更新 (
preparedStatement.addBatch()
) 的PreparedStatements,并每隔“提交一次批处理 (preparedStatement.executeBatch()
)” N”条记录。您可能想要构建原型(prototype)来了解“N”的理想值是多少,但 100 是一个不错的起点。
我不推荐存储过程。如果您只是进行直插入,它们不会为您做太多事情。
关于java - 更有效地存储文件中的记录的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585350/