java - 更有效地存储文件中的记录的方法

标签 java sql oracle jdbc prepared-statement

最近在讨论中有人问我: 您有一个平面文件,其中包含许多记录,例如 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/

相关文章:

java - Apache Axis : How to set call properties using code generated from wsdl2java?

java - 访问 Maven 项目中的属性文件

java - 尝试在另一个方法中运行方法时出现错误 "This method requires a body instead of a semicolon"

sql:像任何vs像所有

java - 一次性向数据库插入100万条记录需要采取哪些措施?

sql - 使用 case 语句创建触发器

java - Intellij IDEA 中的 FreeMarker : Buint-in string 'contains' highlighted as should have any parameters

sql - 单个 SQL 查询中允许的最大子查询数

php - 对于以下场景,如何使用 SQL 查询显示按月结果?

java - 使用 tomcat 数据源 - 如何通过 spring jndi 访问数据源以获取当前数据库池状态