finereport——Java报表工具软件» 理解FineReport缓存系列2——数据集共享

?

理解FineReport缓存系列2——数据集共享

数据集共享(也称SQL共享)

对于同一个的并发很多,或者不同的报表使用同样的数据集时,可以使用这个优化手段。

?

原理:

当多个报表在服务器端执行的时候,他们可能使用同样的数据库查询数据集。同样指的是这些数据库查询,经过参数处理后(在有参数的情况下),生成的SQL是相同的。他们是不同的数据集,所以需要分别到数据库去执行SQL查询,取数等等,但他们做的却是同样的重复的事情,如果能够重用共享他们,使用同样的取数过程,不但可以节省下数据库资源,而且还可以提高取数的速度。这就是所谓数据集共享,也称SQL共享

?

在多个客户端同时请求同一个报表模板时候,如果使用了数据集共享,原先的多个数据查询取数过程,现在只需要一个就可以完成。更进一步,不同的模板也可以使用同样的数据集,它们也可以共享。

?

的数据集共享是全局的,用户可以自己设置是否共享。每个数据库查询数据集都有一个“是否共享数据集”的属性。希望共享时,可以设置这个属性为true。当一个数据集共享之后,并非所有“同样的”数据集都可以共享此数据集,只有那些共享属性也为true的数据集才能共享。

?

举个例子,如果AB两个数据集,一个共享,另一个不共享,则他们仍然是不同的取数过程。当AB都共享时,就是同一个取数过程了。简言之,所有的共享的数据集集合分享同一个取数过程。

?

使用说明:

一个数据集如果希望共享,也就是希望加入其SQL对应的共享部落,只需要设置一下共享属性,打钩就行。如下:

打开报表设计器: 报表|数据集|数据集查询

?

?

打钩表示共享。

?

二、模板结果共享缓存

顾名思义,“模板结果共享缓存”就是把报表的执行结果缓存下来,存成cptpdf等文件,在多次访问之间共享同样的执行结果。

?

原理:

我们在前面的取数缓存原理中提到过,可以利用不同硬件I/O之间性能造价差异,使用缓存来提高效率,那我们这边的缓存是利用的什么性能“差异”呢?先看一个例子:

?

客户端A访问服务器上的报表设计模板,进过模型取数执行后,生成想要的模板结果文件,缓存到某处,并传回客户端。

而客户B访问服务器发现他想要的模板结果文件就是A缓存的那些文件,于是不经过报表模型的处理,直接去拿A缓存的那些文件,然后传回客户端。

?

如果要从原始模板得到客户端想要的结果模板,需要经过“FineReport模型”这一“中间层”处理产生,除非“它已经在那儿”。

?

由此我们可以得到与取数缓存类似的结论(>>”表示远快于)

去某处缓存取模板结果 >> 通过报表模型产生模板结果

这边的“FineReport模型”是不很像“网络I/O”中的“网线”或者“中转站”。

?

正如所说:最纯粹、最抽象的设计难题之一,就是设计桥梁。你面对的问题,基本上就是如何使用最少的材料,跨越给定的距离。

?

使用说明:

为了说明报表结果缓存怎么使用,用一个例子配合说明。

步骤一:

新建一个,在单元格A1中写公式=Now()

?

步骤二:

保存为now.cpt

?

步骤三:

服务器|缓存设置

设置模板共享缓存生存时间为10s

?

步骤四:

首先是没有使用模板共享缓存的情况下,点击分页预览按钮。

http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt

?

不断的刷新浏览器,会看到时间会不断刷新,说明每次都会经过FineReport模型计算

?

步骤五:

修改url,在后面加上__cache__=true,表示使用模板共享缓存,如下:

http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt&__cache__=true

不断刷新浏览器,会看到在10秒以内,时间不会变化,但是一旦超过10s,显示的时间就会更新,说明模板共享缓存起作用了。

另外,模板共享缓存的使用借鉴了数据集缓存的想法,就是只有两个模板的访问地址都有__cache__=true的时候,他们才会共享模板结果,此时如果另一个访问希望使用缓存,只要在url后面加上__cache__=true就行了。如果一个带有__cache__=true参数的模板{dy}次访问时没有缓存,则会创建缓存,缓存超过“{zd0}生存时间”或着未被使用的时间超过“{zd0}空闲”时间,那么会自动更新缓存。所以,可以根据对数据时效的敏感程度不同设置“{zd0}生存时间”。

?

三、缓存设置面板的使用说明

打开设计器,服务器|缓存设置

?

1.?????? 缓存路径设置,是报表服务器上所有缓存数据存放的路径,此路径一般需要在部署时设置。

2.?????? 内存缓存容量是使用取数本地缓存时,每个数据集{zd0}的内存容量,默认为48MB

3.?????? 数据集和结果模板的共享属性设置中包括4项:

{zd0}活动对象,是指在缓存容器中{zd0}放置的缓存对象个数,如果活动对象数超过此数目,则服务器会根据下面的缓存策略来选择哪些对象留下,哪些被去除,FIFO表示先进来的先出去。

{zd0}空闲时间指的是缓存对象在容器中停留不被使用不能超过的时间,也就是空闲的时间,如果空闲的时间超过这个时间,此对象就会被移除。

{zd0}生存时间指的是缓存对象在容器中存活的{zd0}时间,无论是否活动,一旦超过此时间,此缓存对象就失效,将会被移除。

?

如何灵活协调的设置这些参数,需要根据上面说的那些原理来确定。没有明确原因时,不建议改动。

评论审阅已启用。您的评论可能需要一段时间才会出现。

郑重声明:资讯 【finereport——Java报表工具软件» 理解FineReport缓存系列2——数据集共享】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——