用于存储文件记录的更有效方法

时间:2013-07-11 04:57:46

标签: java sql oracle jdbc prepared-statement

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

我的建议是创建:

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

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

2 个答案:

答案 0 :(得分:2)

听起来你有正确的方法。

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

  • 1个线程来读取文件并提交数据库更新。
  • 正如bitfiddler所说,对每条记录使用PreparedStatements和批量更新(preparedStatement.addBatch()),并提交批次(preparedStatement.executeBatch())每条“N”条记录。您可能想要原型以查看“N”的理想值是什么,但100是一个很好的起点。

我不推荐存储过程。如果你只是直接插入,它们对你没有太大帮助。

答案 1 :(得分:0)

好问题。使用预准备语句在这里很重要,因为它将减少每个插入所涉及的开销。你当然不希望它每次解析“插入等等......”。我不担心管理读取文件的线程等等,这就是操作系统为你做的事情。只需通过缓冲区读取文件的大块,然后从中进行插入。您可能会考虑通过生成多个插入器任务实例将文件划分为块,这些实例首先寻找文件并从那里读取块。操作系统应缓冲读取,以便寻求不会坏。当然,如果您的数据库不在RAID或至少是另一个卷上,则所有投注均已关闭。只是一些想法来搅拌锅......