数据集共享(也称SQL共享)
对于同一个报表的并发很多,或者不同的报表使用同样的数据集时,可以使用这个优化手段。
原理:
当多个报表在服务器端执行的时候,他们可能使用同样的数据库查询数据集。同样指的是这些数据库查询,经过参数处理后(在有参数的情况下),生成的SQL是相同的。他们是不同的数据集,所以需要分别到数据库去执行SQL查询,取数等等,但他们做的却是同样的重复的事情,如果能够重用共享他们,使用同样的取数过程,不但可以节省下数据库资源,而且还可以提高取数的速度。这就是所谓数据集共享,也称SQL共享。
在多个客户端同时请求同一个报表模板时候,如果使用了数据集共享,原先的多个数据查询取数过程,现在只需要一个就可以完成。更进一步,不同的模板也可以使用同样的数据集,它们也可以共享。
FineReport的数据集共享是全局的,用户可以自己设置是否共享。每个数据库查询数据集都有一个“是否共享数据集”的属性。希望共享时,可以设置这个属性为true。当一个数据集共享之后,并非所有“同样的”数据集都可以共享此数据集,只有那些共享属性也为true的数据集才能共享。
举个例子,如果A、B两个数据集,一个共享,另一个不共享,则他们仍然是不同的取数过程。当A、B都共享时,就是同一个取数过程了。简言之,所有的共享的数据集集合分享同一个取数过程。
使用说明:
一个数据集如果希望共享,也就是希望加入其SQL对应的共享部落,只需要设置一下共享属性,打钩就行。如下:
打开报表设计器: 报表|数据集|数据集查询
打钩表示共享。
二、模板结果共享缓存
顾名思义,“模板结果共享缓存”就是把报表的执行结果缓存下来,存成cpt,pdf等文件,在多次访问之间共享同样的执行结果。
原理:
我们在前面的取数缓存原理中提到过,可以利用不同硬件I/O之间性能造价差异,使用缓存来提高效率,那我们这边的缓存是利用的什么性能“差异”呢?先看一个例子:
客户端A访问服务器上的报表设计模板,进过FineReport模型取数执行后,生成想要的模板结果文件,缓存到某处,并传回客户端。
而客户B访问服务器发现他想要的模板结果文件就是A缓存的那些文件,于是不经过报表模型的处理,直接去拿A缓存的那些文件,然后传回客户端。
如果要从原始模板得到客户端想要的结果模板,需要经过“FineReport模型”这一“中间层”处理产生,除非“它已经在那儿”。
由此我们可以得到与取数缓存类似的结论(“>>”表示远快于):
去某处缓存取模板结果 >> 通过报表模型产生模板结果
这边的“FineReport模型”是不很像“网络I/O”中的“网线”或者“中转站”。
正如Paul Graham所说:最纯粹、最抽象的设计难题之一,就是设计桥梁。你面对的问题,基本上就是如何使用最少的材料,跨越给定的距离。
使用说明:
为了说明报表结果缓存怎么使用,用一个例子配合说明。
步骤一:
新建一个报表,在单元格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参数的模板第一次访问时没有缓存,则会创建缓存,缓存超过“最大生存时间”或着未被使用的时间超过“最大空闲”时间,那么会自动更新缓存。所以,可以根据对数据时效的敏感程度不同设置“最大生存时间”。
三、缓存设置面板的使用说明
打开设计器,服务器|缓存设置
1. 缓存路径设置,是报表服务器上所有缓存数据存放的路径,此路径一般需要在部署时设置。
2. 内存缓存容量是使用取数本地缓存时,每个数据集最大的内存容量,默认为48MB
3. 数据集和结果模板的共享属性设置中包括4项:
最大活动对象,是指在缓存容器中最大放置的缓存对象个数,如果活动对象数超过此数目,则服务器会根据下面的缓存策略来选择哪些对象留下,哪些被去除,FIFO表示先进来的先出去。
最大空闲时间指的是缓存对象在容器中停留不被使用不能超过的时间,也就是空闲的时间,如果空闲的时间超过这个时间,此对象就会被移除。
最大生存时间指的是缓存对象在容器中存活的最大时间,无论是否活动,一旦超过此时间,此缓存对象就失效,将会被移除。
如何灵活协调的设置这些参数,需要根据上面说的那些原理来确定。没有明确原因时,不建议改动。