多用户间共享缓存
概念定义
当用户A访问报表A时,引擎会把计算结果缓存下来,当用户B(也可能是用户A再次访问)以同一参数再次访问时,引擎直接把缓存报表返回,而不必重新计算。
功能背景
用户间共享缓存的目的,是为了避免不同用户访问同一张报表时重复运算的问题。因此可以把A用户访问报表时计算出的结果报表保存下来,当B用户也访问这个报表时,直接把保存下来的结果报表返回给B用户,不再重新计算。
对于带有参数和宏的报表,当用户采用相同的参数和宏进行重复访问时,也可以利用缓存,减少重复的计算。但是如果参数和宏不一样,报表就只能重新计算,因为不同参数运算出来的结果报表不一样,无法利用缓存。因此,对于有参数和宏的报表,缓存时还必须识别参数和宏的值。
控制方式
用户间共享缓存包括三个层面,模板共享、结果报表共享、分页后报表共享,我们可以通过三种方式对其进行控制。
授权控制
授权控制主要是用来控制结果报表共享和分页后报表共享的。一般是由用户所获得的授权来决定。
参数控制
参数控制主要是用来控制模板共享的。若要实现多用户之间共享模板,可以通过配置reportConfig.xml文件中alwaysReloadDefine参数来实现。设置alwaysReloadDefine的value为yes时,模板不可以被共享;设置alwaysReloadDefine的value为no时,可以实现模板之间的共享。
标签控制
标签控制主要是用来控制结果报表共享和分页后报表共享的。一般是通过tag标签中的useCache与timeout属性来设置的。
当且仅当reportConfig.xml里的alwayReloadDefine属性设置为no时,tag标签中的useCache与timeout属性才会起作用,useCache属性控制是否启用缓存,而timeout为取多少长时间内生成的报表.
使用方法
参数控制
相关配置在reportConfig.xml中,其中时间以分钟为单位,可配置的属性如下所示:
<config><!-- 是否每次重新装载报表模板 --> <name>alwaysReloadDefine</name><value>no</value> </config> <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>
说明:
1、 alwaysReloadDefine这个参数如果被关闭(即设置为yes),那么每次新任务请求都直接装载模板重新计算报表,不会读取缓存
2、 在1的情况下,新读取的模板和新计算的报表照样会被缓存,其目的是为了实现3.1中的功能
3、 因此在1的情况下,意味着缓存中的对象会无限庞大,直到缓存对象过期才会被清除。所以,如果不是特殊需要,一般建议不要关闭alwaysReloadDefine。
4、 如果必须关闭alwaysReloadDefine,那么建议缓存时间设置短一点,例如半小时,一般用户浏览一个报表半小时内还不翻页打印导出的话,多半也不会再次操作了。这样可以让缓存对象清除得及时点,避免缓存过于庞大。
标签控制
首先先将reportConfig.xml里的alwayReloadDefine属性设置为no时,然后在发布报表的页面中TAG中使用useCache和 timeout属性。
<report:html name="report1"reportFileName="api/wangge.raq"useCache="yes" //是否使用缓存timeout="30" //从缓存系统中取多少分钟内产生的报表,如果没有此时间内的,则产生一个新报表,该属性的单位为分钟/>
上述属性的设置表示在如果A用户读取了报表wangge.raq,那么在30分钟内,如果B用户去读取wangge.raq报表时,系统不再计算该报表,只是从缓存中读取该报表,并返回给B用户,同时将缓存中wangge.raq的缓存时间修改为B用户读取的时间。