单用户缓存

单用户缓存是指当某个客户端访问某个报表,引擎将其计算出来后,会将运算结果缓存下来。同一个客户端访问完该报表后,如果需要对同一报表结果进行别的操作,例如打印、导出、翻页等,引擎直接从缓存里取报表结果,而不必重新计算。

 

功能背景:

由于web服务器与浏览器之间无连接的特性,导致B/S方式下服务器端实体(在我们报表系统中主要是指报表模板、报表及报表分页)的生命周期无法完全与浏览器端保持一致。

 

举例来说,客户端访问了一张报表,报表计算且向客户端输出完毕后,是否应当从内存中清除报表对象呢?服务器无法判断客户端是否还需要使用这个对象,事实上,客户端往往还需要翻页、打印、导出等操作,此时还需要使用报表对象;而客户端也完全有可能关闭浏览器,不再访问了。因此,如果服务器端清除了报表对象,则客户端进行翻页、打印、导出等操作时,不得不重新进行计算,浪费CPU;如果客户端不再访问了而服务器端却保留着报表对象,则会浪费内存。

 

为了解决这个问题,我们对这些实体采取了带时间管理的缓存策略。

 

如果通过tag标签访问,自动会缓存报表。通过调用API接口计算报表,如果不调用缓存管理器的API,就不会进行报表缓存。

 

使用方法:

缓存时间和缓存目录的配置在raqsoftConfig.xml中,其中时间以分钟为单位,如下所示:

<!-- 配置缓存报表目录 -->

<property name="cachedReportDir " value=" c:\runqian\cached " />

<!-- 配置报表最大未访问时长,以分钟为单位 -->

<property name="cachedReportTimeout " value="120" />

 

说明:

1、  如果缓存报表超过最大未访问时长而没有被访问,则会被引擎清除。

2、  引擎对用户输入的参数也做了缓存,这个缓存是在内存中的。当报表缓存被清除时,如果用户请求翻页等操作,引擎会利用参数缓存自动重新计算报表,而不需要用户重新输入参数

3、  如果用户请求翻页等操作时,参数缓存也被清除了,就会提示用户重新访问并输入参数

4、  一般来说,参数的最大未访问时长应当比报表的最大未访问时长更长,否则没有意义。

5、  引擎每隔5分钟扫描一次缓存,清除超时缓存。因此,如果上一次扫描刚结束时才到达缓存期限的报表,得到下一次扫描时才会被清除,等于延长了4.999.....分钟,这里的9理论上可以无穷多,接近5分钟。举例来说,缓存期限为2分钟的报表,如果在扫描结束后才到2分钟,那么下一次扫描时相当于已经缓存了6.999....分钟;再举例,缓存期限为6分钟的报表,如果在扫描结束时才到6分钟,那么下一次扫描时可能已经缓存了10.999....分钟了。