在访问报表时,如果数据量较大或者计算复杂,访问报表时就会等待较长时间,用户希望能够提高报表的访问速度。
这种报表基本上都有固定条件,比如按照用户名登陆,这样的话就可以想办法先将报表计算出来,用户访问时直接取报表结果就行。
集算报表提供了缓存管理,当开始缓存时(配置文件中的alwaysReloadDefine值为no),第一次访问报表时会进行计算,如果再次访问同一张报表,就会直接从缓存中取结果,能够提高报表访问速度,这种方式一般都是通过报表系统自行处理,针对用户的需求,报表提供了api方式,能够调用api自主对缓存进行控制,代码如下:
long time=-1;//定义缓存有效时间,-1为一直有效
for(int i=1;i<=5;i++){
Context cxt = newContext();
cxt.setParamValue("szzb",String.valueOf(i));//szzb为报表中定义的参数
CacheManager manager =CacheManager.getInstance();
ReportEntry entry =manager.getReportEntry("testhc.rpx");
ReportCache cache =entry.getReportCache( cxt, time );
IReport report =cache.getReport();
}
可以在jsp中手动调用相应api代码,也可以在web.xml中增加个listener,应用启动时直接调用。
注:1、如果是按照参数循环,Contextcxt = new Context();这个要写在循环的最内侧,否则数据集缓存会取错
2、参数类型必须一致,比如报表中定义参数是字符串型,那么api中传入的必须是string。
3、报表名称和访问url上必须一致,有时url上会将报表名上加个斜线,也能正确访问报表,但是找缓存时要求保证严格一致。
4、如果在listener中调用,web.xml会有加载顺序,会先加载listener,后加载servlet,而此时报表的servlet还没加载,会导致找授权文件,报表路径等有问题,所以需要在api中增加个时间延迟,比如:Thread.currentThread().sleep(15000);,过段时间后再执行报表api