当前位置: 首页 > news >正文

报表性能优化方案之数据集缓存与共享

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 问题描述

对于大数据量报表,若每次直接从数据库中查询数据,不仅增加数据库服务器的压力,也极大的影响了取数的速度从而降低了报表的执行速度,为此FineReport提供了数据集缓存与共享功能。

FineReport可先将其数据集查询的结果缓存下来,对于缓存下来的数据,再次使用到相同数据集时,无需再次连接数据库重新查询数据,直接使用缓存下来的结果,即使用FineReport的数据集共享机制,达到资源复用,减少取数时间从而提高了报表的展现速度。

2. 数据集缓存

缓存分为缓存至内存和缓存至磁盘。

2.1 缓存至内存

设置方法:默认的就是使用内存缓存即所有数据都保存在内存中,在数据库查询窗口可以看到,如下图:

 

设置后的效果:当执行数据集时就会在将此记过缓存至内存中,下次在执行此数据集时,会直接从内存缓存中取数。

优缺点:空间资源有限,但效率很高,取数速度快。

什么情况使用:一般使用率高,且数据量不算太大的报表,可直接使用内存缓存。

2.2 缓存至磁盘

设置方法:点击下拉框选择缓存至磁盘当记录大于,并设置行数,如下:

 

缓存至磁盘,即将数据缓存到服务器的磁盘中,默认是在C:\Documents and Settings\Administrator\.FineReport8.0\cache(windows操作系统)下。

注:如启用了磁盘缓存,发现系统目录下没有cache文件夹,不要感到惊讶,虽然激活了磁盘缓存,但不是马上开始把数据写到磁盘中,而是会考虑系统的实际运行情况然后再进行处理。

设置后的效果:记录数默认大于0行:表示从第0条数据开始,使用磁盘缓存。即只采用磁盘缓存,取出的数据是全部放在磁盘中。

记录数大于如1000行:表示取得的数据前1000条是放入内存中,剩余部分缓存至磁盘,当用到1000条以外的数据时,就会从磁盘中读取数据。

优缺点:空间资源又大又便宜,几乎没有限制;但效率低,取数速度往往很慢。

什么情况使用:若是数据量很大的报表,如:几十万条记录,可使用缓存至磁盘,设置恰当的行数,避免全存在内存中,导致服务器OutOfMemory内存溢出。

如行式引擎报表,可以将使用率高的前N页数据缓存在内存,剩余记录缓存在磁盘中。

注:既然两者都有优缺点,因此需要合理分配内存和磁盘,把那些使用频率最高的数据尽量放在内存中,从而提高在内存中的命中率。

3. 数据集共享

设置了数据集缓存后,只对当前数据集再查询时才能读取缓存中的数据,若多个模板包含有相同的数据集(定义的SQL查询语句相同,传入的参数值相同,才算相同的数据集),便可以启用数据集共享,使得他们共享同一个缓存结果,从而节省数据库资源,并且提高取数和报表的展现速度。

3.1 设置方法

在定义数据连接的地方勾选是否共享数据集,如下图所示:

 

注:数据集缓存是对当前数据集有效,而共享数据集是对不同模板的相同数据集有效,并且需要将需要共享的数据集都勾选上。

3.2 数据集共享属性设置

我们可以对缓存下的结果进行一些设置。

进入FR平台中,选择管理系统>系统管理>缓存,可以看到数据集共享属性如下图所示:

 

最大活动对象:指在缓存容器中最大放置的缓存对象个数,如果活动对象数超过此数目,则服务器会根据下面的缓存策略来选择哪些对象留下,哪些被去除

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

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

注:管理系统>系统管理>缓存,下方的模板缓存属性设置,是对模板计算的结果进行缓存设置,而上面所说的在数据集处的缓存设置则是对数据进行缓存设置,一个是对结果来说,一个是对于数据来说,要区别开来,这是两个不同的概念。

转载于:https://my.oschina.net/jiuyuenihao/blog/509913

相关文章:

  • 站在OC的基础上快速理解Swift的类与结构体
  • Shell脚本编程小结
  • 解决因特网和xshell考虑到问题
  • Android之Handler的postDelayed()使用方法
  • iOS UI进阶-2.0 CALayer
  • 机器学习---学习首页
  • Javascript和OCX的结合历程
  • 解析微信开发之搜索歌曲
  • rhel 6.5 x86_64 配置centos yum源
  • C/C++连接MySql数据库
  • 【转】【Linux】 临界区,互斥量,信号量,事件的区别
  • LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
  • VMWare下虚拟机NAT共享方式上网的配置说明
  • hadoop中遇到的问题。
  • Android基础小技术点:Android ListView设置背景图片及分割线、周边距
  • 自己简单写的 事件订阅机制
  • 08.Android之View事件问题
  • axios 和 cookie 的那些事
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Fundebug计费标准解释:事件数是如何定义的?
  • input实现文字超出省略号功能
  • passportjs 源码分析
  • PAT A1092
  • 阿里云购买磁盘后挂载
  • 每天一个设计模式之命令模式
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何实现 font-size 的响应式
  • 跳前端坑前,先看看这个!!
  • 协程
  • 自定义函数
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​ArcGIS Pro 如何批量删除字段
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #{} 和 ${}区别
  • #mysql 8.0 踩坑日记
  • $(selector).each()和$.each()的区别
  • (04)odoo视图操作
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C语言)字符分类函数
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)插入排序
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net framework4与其client profile版本的区别
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • [20180224]expdp query 写法问题.txt
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [android] 切换界面的通用处理
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++]指针与结构体
  • [CF]Codeforces Round #551 (Div. 2)