单用户缓存
概念定义
单用户缓存是指当某个客户端访问某个报表,引擎将其计算出来后,会将运算结果缓存下来。同一个客户端访问完该报表后,如果需要对同一报表结果进行别的操作,例如打印、导出、翻页等,引擎直接从缓存里取报表结果,而不必重新计算。
功能背景
由于WEB服务器与浏览器之间无连接的特性,导致B/S方式下服务器端实体(在我们报表系统中主要是指报表模板、报表及报表分页)的生命周期无法完全与浏览器端保持一致。
举例来说,客户端访问了一张报表,报表计算且向客户端输出完毕后,是否应当从内存中清除报表对象呢?服务器无法判断客户端是否还需要使用这个对象,事实上,客户端往往还需要翻页、打印、导出等操作,此时还需要使用报表对象;而客户端也完全有可能关闭浏览器,不再访问了。因此,如果服务器端清除了报表对象,则客户端进行翻页、打印、导出等操作时,不得不重新进行计算,浪费cpu;如果客户端不再访问了而服务器端却保留着报表对象,则会浪费内存。
为了解决这个问题,我们对这些实体采取了带时间管理的缓存策略
如果通过tag标签访问,自动会缓存报表。通过调用API接口计算报表,如果不调用缓存管理器的API,就不会进行报表缓存。
使用方法
缓存时间和缓存目录的配置在reportConfig.xml中,其中时间以分钟为单位,如下所示:
<config> <!-- 配置缓存报表目录 -->
<name>cachedReportDir</name>
<value>c:\runqian\cached</value>
</config>
<config>
<!-- 配置报表最大未访问时长,以分钟为单位 -->
<name>cachedReportTimeout</name>
<value>120</value>
</config>
<config>
<!-- 配置参数最大未访问时长,以分钟为单位 -->
<name>cachedParamsTimeout</name>
<value>120</value>
</config>
说明:
- 如果缓存报表超过最大未访问时长而没有被访问,则会被引擎清除。
- 引擎对用户输入的参数也做了缓存,这个缓存是在内存中的。当报表缓存被清除时,如果用户请求翻页等操作,引擎会利用参数缓存自动重新计算报表,而不需要用户重新输入参数
- 如果用户请求翻页等操作时,参数缓存也被清除了,就会提示用户重新访问并输入参数
- 一般来说,参数的最大未访问时长应当比报表的最大未访问时长更长,否则没有意义。
- 引擎每隔5分钟扫描一次缓存,清除超时缓存。因此,如果上一次扫描刚结束时才到达缓存期限的报表,得到下一次扫描时才会被清除,等于延长了4.999.....分钟,这里的9理论上可以无穷多,接近5分钟。举例来说,缓存期限为2分钟的报表,如果在扫描结束后才到2分钟,那么下一次扫描时相当于已经缓存了6.999....分钟;再举例,缓存期限为6分钟的报表,如果在扫描结束时才到6分钟,那么下一次扫描时可能已经缓存了10.999....分钟了。