回 帖 发 新 帖 刷新版面

主题:[转帖]理解FineReport缓存系列2——数据集共享


[b]数据集共享(也称SQL共享)[/b]
对于同一个[url=http://www.finereport.com]报表[/url]的并发很多,或者不同的报表使用同样的数据集时,可以使用这个优化手段。

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

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

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

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

[b]使用说明:[/b]
一个数据集如果希望共享,也就是希望加入其SQL对应的共享部落,只需要设置一下共享属性,打钩就行。如下:
打开报表设计器: [i]报表|数据集|数据集查询[/i]

 [img]http://www.finereport.com/forumimages/e8.png[/img]
打钩表示共享。

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

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

客户端A访问服务器上的报表设计模板,进过[url=http://www.finereport.com]FineReport[/url]模型取数执行后,生成想要的模板结果文件,缓存到某处,并传回客户端。
而客户B访问服务器发现他想要的模板结果文件就是A缓存的那些文件,于是不经过报表模型的处理,直接去拿A缓存的那些文件,然后传回客户端。

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

由此我们可以得到与[b]取数缓存[/b]类似的结论(“>>”表示远快于):
[b]去某处缓存取模板结果 >> 通过报表模型产生模板结果[/b]
这边的“FineReport模型”是不很像“网络I/O”中的“网线”或者“中转站”。

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

[b]使用说明:[/b]
为了说明报表结果缓存怎么使用,用一个例子配合说明。
步骤一:
新建一个报表,在单元格A1中写公式=Now()
 
 [img]http://www.finereport.com/forumimages/e9.png[/img]
步骤二:
保存为now.cpt
 [img]http://www.finereport.com/forumimages/e10.png[/img]
步骤三:
服务器|缓存设置
设置模板共享缓存生存时间为10s。
  [img]http://www.finereport.com/forumimages/e11.png[/img]
步骤四:
首先是没有使用模板共享缓存的情况下,点击分页预览按钮。
http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt
 [img]http://www.finereport.com/forumimages/e12.png[/img]
不断的刷新浏览器,会看到时间会不断刷新,说明每次都会经过FineReport模型计算

步骤五:
修改url,在后面加上__cache__=true,表示使用模板共享缓存,如下:
http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt&__cache__=true
不断刷新浏览器,会看到在10秒以内,时间不会变化,但是一旦超过10s,显示的时间就会更新,说明模板共享缓存起作用了。
另外,模板共享缓存的使用借鉴了数据集缓存的想法,就是只有两个模板的访问地址都有__cache__=true的时候,他们才会共享模板结果,此时如果另一个访问希望使用缓存,只要在url后面加上__cache__=true就行了。如果一个带有__cache__=true参数的模板第一次访问时没有缓存,则会创建缓存,缓存超过“最大生存时间”或着未被使用的时间超过“最大空闲”时间,那么会自动更新缓存。所以,可以根据对数据时效的敏感程度不同设置“最大生存时间”。

[b]三、缓存设置面板的使用说明[/b]
打开设计器, 服务器|缓存设置
  [img]http://www.finereport.com/forumimages/e13.png[/img]
1.    [b]缓存路径设置[/b],是报表服务器上所有缓存数据存放的路径,此路径一般需要在部署时设置。
2.    [b]内存缓存容量[/b]是使用取数本地缓存时,每个数据集最大的内存容量,默认为48MB
3.    数据集和结果模板的[b]共享属性设置[/b]中包括4项:
[b]最大活动对象[/b],是指在缓存容器中最大放置的缓存对象个数,如果活动对象数超过此数目,则服务器会根据下面的[b]缓存策略[/b]来选择哪些对象留下,哪些被去除,FIFO表示先进来的先出去。
[b]最大空闲时间[/b]指的是缓存对象在容器中停留不被使用不能超过的时间,也就是空闲的时间,如果空闲的时间超过这个时间,此对象就会被移除。
[b]最大生存时间[/b]指的是缓存对象在容器中存活的最大时间,无论是否活动,一旦超过此时间,此缓存对象就失效,将会被移除。

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

回复列表 (共5个回复)

沙发

文章很不错,软件用过,也很好用,支持了:-D

板凳


很好很不错的软件

3 楼

很好很不错的软件

4 楼

强大,支持!!!!!!11

5 楼

这得浏览器让我们这么干才成,未发现有这样的功能.

我来回复

您尚未登录,请登录后再回复。点此登录或注册