配置润乾报表的缓存
<wbr></wbr>
<wbr></wbr>
任务背景
不管报表引擎的算法如何优化,报表数据量大到一定程度,用户并发数多到一定程度,服务器的性能总会告急,因此,报表引擎的任务一方面是优化算法,另一方面也是更重要的,是要提供有效的缓存机制与并发控制机制。
<wbr></wbr>
面临困难
报表的缓存,乍一听似乎挺简单的,不就是把算好的报表存下来,然后再次访问时不用再次计算了,直接从缓存里读取吗?实际做起来需要考虑的细节很多,并不那么容易。
首先,要考虑参数和宏。大部分报表都是有参数或者宏的,不同的参数和宏,会算出不同的结果报表,因此,报表的缓存不仅仅和报表模板关联,还和参数、宏有关系,只有参数和宏完全相同的时候,才能从缓存里读取。
其次是缓存时间的问题,如果某个缓存的报表不断地被访问,那么用户访问到的始终是旧报表,无法更新,因此报表缓存的时候还需要记录缓存的时间,而用户访问的时候可以请求多长时间内缓存的报表,从而保证一定的新鲜度。
接着,还需要考虑报表模板的更新问题,一旦报表模板更新了,就要触发该报表的缓存清除,从而保证用户访问到的是新的报表。而这种缓存的清除,不能影响到别的报表。
最麻烦的要数集群的情况了,目前的集群有两种,一种是session和服务器绑定,一旦登陆了就始终访问同一台服务器;另一种是session复制的机制,session不和服务器绑定,可能一会访问这台服务器,一会访问另一台服务器,这种情况用户参数还必须跟着session走。
集群的时候,在A服务器上缓存的报表,在B服务器上是找不到的,此时只能在服务器之间进行通讯,互相查找、读取缓存的报表。
<wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr> 小小的缓存问题,却引发了如此多的麻烦事,不过不用烦恼,润乾报表4.0新推出的缓存机制,很好地解决了上述问题。实现步骤非常简单:</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
实现步骤
1、<wbr> 在reportConfig.xml文件中,把alwaysReloadDefine属性设为no</wbr>
2、<wbr> 在调用报表的jsp中,把 <report:html 标签的useCache属性设为yes,同时设上timeout属性,即调用多少分钟内缓存的报表。</wbr>
<wbr></wbr>
<wbr></wbr>
效果演示
<wbr></wbr>
图1、没有使用缓存,每一次访问,都会与数据库交互一次
<wbr></wbr>
图2、启动缓存机制,再次访问时不再计算,而是直接生成HTML
<wbr></wbr>