理解FineReport报表缓存

FineReport报表缓存技术包括数据集缓存和模板结果共享缓存,合理的使用缓存可以有效的提高性能。

一、数据集缓存

数据集缓存分为取数缓存共享数据集

A. 取数缓存

FineReport的报表取数模型用的是叫做数据集(TableData)的二维表模型。而数据集缓存指的就是针对“数据库查询”这种数据集的取数过程所作的缓存。

背景:

数据库查询,就是通过SQL或者存储过程,从数据库服务器查询取数据传送到服务器以供报表执行用。通常这个取数的过程就是报表执行过程的一部分,因此报表的性能很大程度上依赖于取数的性能,而取数缓存就是为了解决这种性能问题而产生的。特别是数据量较大时,合理的使用缓存,可以控制性能表现。

我们知道服务器各个硬件的I/O性能是不同的,内存I/O >> 硬盘I/O >> 网络 I/O, “>>”表示远快于。在实际应用环境中,数据库服务器和FineReport服务器通常是在不同的服务器上,它们之间的数据交互必须要通过网络I/O来实现。而通常情况下,报表执行过程中可能对一条记录需要使用多次,如果每次都需要到数据库服务器上面去查询取数,不但增加了数据库的压力,而且速度也会很慢。为什么我们不能在第一取数后,把该数据放到本地上的内存和磁盘上,从而提高性能。这就是一种“缓存”, 暂且称为取数本地缓存。

如果把缓存放到本地,那么是放到内存还是磁盘上呢?既然内存I/O的速度比磁盘快很多,可不可以把所有的数据都放在内存上?可以是可以,但不一定是最好的选择。因为相同容量的内存比磁盘的造价高很多,所以存储的成本也要高很多。所以通常情况下,服务器的内存容量也会比磁盘小很多,如果数据库的数据都放在内存上,就很容易造成OutOfMemory。另一个极端是把所有数据都放到磁盘上?这样也不合算,因为虽然空间够用了,但是速度却不够快。所以最好的解决方案是合理的分配内存和磁盘,把那些使用频率最高的数据尽量放在内存中,从而提高在内存中的命中率。这是另一种“缓存”, 我们称之为取数内存缓存。

综上,可以看出,利用缓存技术来优化提高性能,是各种硬件性能造价的差异造成的合理结果。FineReport报表工具致力于研究合理的缓存技术来提高报表的性能。

缺陷:

缓存能够很好的提高性能,但是也有一些缺陷,特别是实时数据敏感的应用。但对于通常的报表应用来说,影响并不大。

1. 拿取数本地缓存来说,数据缓存到本地后,在缓存存活有效期,再次取数时,就不会到数据库取数了。如果此时数据库的数据发生了更新,就不能及时的反应到本地。所以缓存会导致数据延迟,可能不是最新的数据。但是,这个数据延迟的时间可以通过参数来设定。

2. 对于服务器的集群来说,各个服务器之间的缓存需要同步化。比如:当客户端第一次访问报表服务器的时候,A机器计算了报表并在A机器作了缓存,当客户端第二次访问时,例如此时跳转到B机器,B机器上找不到报表的缓存,也找不到参数的缓存,于是只好报错或者重新计算。可以通过提供了集群服务器之间通讯的能力,解决负载均衡时服务器之间跳转访问带来的缓存同步的问题。其原理是,首先,客户端第一次访问报表服务器,A机器计算了报表并在A机器作了缓存,当客户端第二次访问时,例如此时跳转到B机器,B机器根据缓存id判断出是A机器做的缓存,于是B机器向A机器发送缓存请求,A机器读取缓存并把缓存结果发送给B机器,B机器再把结果返回给客户端。

使用说明:

1.取数本地缓存:服务器|缓存参数设置
取数本地缓存
FineReport6.5对于数据库数据集内置了取数磁盘缓存技术,一般用户不需要手动设置,上图显示了本地磁盘缓存的分页大小。是否启用本地磁盘缓存,会根据下面取数内存缓存面板中的“启用磁盘缓存当记录数大于”编辑框,当编辑框中为0时,表示一直启用本地磁盘缓存。

2.取数内存缓存:

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

取数内存缓存
如上红色箭头所指编辑框,就是取数内存缓存设置的地方,编辑框中的数字表示查询结果记录集的记录数大于多少时启用本地磁盘缓存,否则使用取数内存缓存,-1表示全部缓存到内存。

B. 数据集共享(也称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表示先进来的先出去。
最大空闲时间指的是缓存对象在容器中停留不被使用不能超过的时间,也就是空闲的时间,如果空闲的时间超过这个时间,此对象就会被移除。
最大生存时间指的是缓存对象在容器中存活的最大时间,无论是否活动,一旦超过此时间,此缓存对象就失效,将会被移除。

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

立即发现·数据价值

推荐阅读

→ 3张报表搞定财务分析

→ 如何搭建科学的MES报表系统?

→ BIRT报表深度解析之BIRT中国企业级用户流失之谜

→ 生产报表的自动化实现方案

→ 怎样用图表分析数据(一)

→ 用了这款自动化表格制作软件,跟手工表格说再见

→ web报表插件领导品牌FineReport

→ FineReport报表和水晶报表的比较

→ 谈谈数据决策平台搭建的必要性

→ 甘特图(Gantt chart)深度解析

版权所有©2016 南京帆软软件有限公司 | 苏ICP备14031611号-3

返回顶部