如何在java中提高文件读取效率及其数据插入

时间:2014-02-08 19:31:58

标签: java

我们每天都在生产中运行一个autosys工作。它调用一个shell脚本,该脚本又调用java servlet。此servlet读取这些文件并将数据插入两个不同的表中,然后进行一些处理。 Java版本是1.6&应用服务器是WAS7,数据库是oracel-11g。

我们在这个过程中遇到了一些问题,比如需要时间,内存不足等等。以下是我们编写此过程的方式的详细信息。如果可以改进,请告诉我。

  1. 当我们使用BufferedReader读取文件时,我们是否真的在BufferedReader的readLine()方法返回的内存中创建了很多字符串?这些文件包含4-5Lacs的行。所有记录都由换行符分隔。有没有更好的方法来读取java中的文件以实现效率?我无法找到任何提供文件中所有记录行长度可变的事实。

  2. 当我们插入数据时,我们正在使用statement / prepared语句进行批处理。我们正在制作一个包含该文件所有记录的批次。打破批量大小以获得更好的性能真的很重要吗?

  3. 如果表没有定义索引,也没有任何其他约束,并且所有列都是VARCHAR类型,那么哪个操作会更快: - 根据某些匹配条件插入新行或更新现有行?

1 个答案:

答案 0 :(得分:1)

  1. 阅读文件

    使用BufferedReader很好。这里的关键词是读取一堆行,然后处理它们。之后,阅读另一堆行,依此类推。这里一个重要的含义是当你处理第二串行时,不再引用前一串行。这样,您可以确保不会不必要地保留内存空间。但是,如果保留对所有行的所有引用,则可能会遇到内存问题。

    如果你确实需要引用所有行,你可以增加堆大小,或者,如果许多行是重复的,使用intern()或类似的技术来节省内存。

  2. 修改表格

    总是更好地将批次的大小限制为合理的数量。大小越大,您对数据库端的资源约束就越多,也可能是您的jvm端。

  3. 插入或更新

    如果您已定义索引,我会说更新表现更好。但是,如果您没有索引,则插入应该更好。 (您可以访问环境,也许您可​​以进行测试并与我们分享结果?)

  4. 最后,您还可以考虑使用多线程来处理“修改表格”,以提高整体效果和效率。