爪哇 – 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