其他分享
首页 > 其他分享> > 爪哇 – Apache的POI – 是缓存的工作簿重用最好的方法?

爪哇 – Apache的POI – 是缓存的工作簿重用最好的方法?

作者:互联网

我们在生产中使用Apache POI已经有好几年了.当前在版本3.11.我们仅使用HSSF(根据我们的测试,其速度比XSSF快,并且无需XLSX就可以生存.)

当前,我们在内存中保留了大约70个“同步工作簿运行程序”的缓存映射.考虑每个XLS产品,然后map键告诉我们要使用哪个产品.我们在启动时加载缓存,因此我们永远不会实时读取文件.

我们同步的跑步者大致是这样的:

public class PoiProcessorSynchronized {
  private Workbook workbook;
  public synchronized Map<String, Object> process(Request request) {
    engine.process(workbook, request); //request has input/output params
  }
}

这使性能相当不错(过去24小时平均有27k个请求,平均112ms),有些工作表很慢,有些很快.我们在处理之间手动将输入重置为工作表,以确保两次使用之间工作表是干净的.

保持图纸的同步处理以防止计算错误.最初,我们确实看到了一些错误的计算,而没有控制对工作表的访问.自从我们这样做以来,它一直很牢固.

我担心的一些问题:

>每个XLS,每个服务器一次只能处理一个请求.我们可以通过某种我想是的处理器池来解决这个问题
>工作簿的内存相对较大.如果我们继续将XLS添加到缓存,则必须添加越来越多的内存.

是否有人在尝试做类似的事情?该方法目前正在起作用,但感觉应该有更好的方法.

是否可以缓存工作簿以外的其他内容?还是序列化的东西?

是否有人通过工作簿成功处理了大批量交易而不进行同步?如果可以,怎么办?

解决方法:

在库级别,Apache POI是线程安全的.在工作簿级别(工作表/行/单元/等级别),Apache POI不是线程安全的.给定的工作簿一次只能由一个线程处理.如果您有多个并行工作的线程,则它们必须具有自己的工作簿才能进行处理.不支持在同一工作簿上工作的两个线程(包括在同一工作簿中的不同工作表上工作).

总体而言,加载.xls文件相当快.使用File rather than an InputStream if you can可以稍微降低内存并加快加载速度.请参阅memory and performance FAQ for some guides.确保您使用的是针对bug fixes and improvements的最新版本的Apache POI.

对于您的特定情况,最流行的工作簿的某种缓存可能效果很好.也许仅适用于较大的流行工作簿,而小型工作簿总是按需加载.

否则,请尝试进行性能分析,然后查看POI是否对某些文件做了太多工作.然后report that and work to get it fixed,性能改进总是受到项目的欢迎!

标签:apache-poi,java
来源: https://codeday.me/bug/20191119/2034538.html