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

java中如何提高文件读取效率及其数据插入,java,Java,我们每天都有一个autosys作业在生产中运行。它调用一个shell脚本,该脚本反过来调用一个Javaservlet。这个servlet读取这些文件并将数据插入两个不同的表中,然后进行一些处理。Java版本是1.6,应用服务器是WAS7,数据库是oracel-11g 我们在这个过程中遇到了一些问题,如耗时、内存不足等。下面是我们编写这个过程的详细方式。如果可以改进,请告诉我 当我们使用BufferedReader读取文件时,我们是否真的在内存中创建了大量由BufferedReader的readL

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

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

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


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

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

  • 读取文件

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

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

  • 修改表

    最好将批次大小限制在合理数量。大小越大,对数据库端和jvm端施加的资源约束就越多

  • 插入或更新

    如果定义了索引,我会说更新性能更好。但是,如果没有索引,insert应该更好。(您可以访问环境,也许您可以进行测试并与我们共享结果?)


  • 最后,你也可以考虑使用<强>多线程<强>来修改“表”的一部分,以提高整体性能和效率。

    “我们正在制作一个包含文件的所有记录的批处理。”这可以解释为什么内存不足。如果通过性能,你也包括。“不因内存问题而崩溃”则是,如果将批插入划分为较小的批,则不必在内存中存储所有这些字符串。插入新行将是O(1)。更新现有行将是O(N)。请定义一些索引。