润乾 v2018 自定义生成缓存

在访问报表时,如果数据量较大或者计算复杂,访问报表时就会等待较长时间,用户希望能够提高报表的访问速度。

这种报表基本上都有固定条件,比如按照用户名登陆,这样的话就可以想办法先将报表计算出来,用户访问时直接取报表结果就行。

集算报表提供了缓存管理,当开始缓存时(配置文件中的 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