在报表项目中,常常会碰到数据库压力很大影响整个系统性能的问题。由下面的传统方案的结构示意图可以看出,全部数据存储和源数据计算都放在数据库完成。当并发访问量较大的时候,虽然每个报表的数据量不大,还是会造成数据库压力过大,成为性能的瓶颈。多数数据库厂商提供的jdbc接口传输数据比较缓慢,在并发量较大的情况,对报表系统性能的影响也非常明显。
这种情况时可以考虑采用润乾集算报表提供的本地计算方案。
从上图可以看出,润乾集算报表可以将部分数据从数据库转移到报表应用服务器的本地硬盘。这部分数据可以是计算的中间结果,也可以是部分基础数据。集算报表内置了集算引擎,可以通过简洁的脚本进行本地化的数据计算。因此,从数据存储和计算两方面都可以降低数据库压力。
部分数据和计算从数据库转移到报表应用服务器上,可以充分利用应用服务器集群的存储和计算能力。应用服务器无论是单机升级(纵向扩展)或者增加集群数量(横向扩展)都要比数据库服务器的成本低很多。在本地硬盘上读取数据的速度要比数据库jdbc快很多,可以解决这个瓶颈问题。集算引擎还可以进行多线程的并行计算,可以充分发挥应用服务器多cpu、多核的计算能力。因此,润乾集算报表方案是低成本提高报表应用系统性能的优选方案。
下面,通过“某公司客户累计销售额与去年全年销售额对比报表”的制作,来看一下集算报表是如何实现本地化计算的。报表如下图:
这张报表中的客户、订单数、销售额都是直接从数据库中计算的2010年1月-10月的数据。2009年全年的订单数、销售额是从报表应用服务器文件系统中的temp2009sales.b文件中读取。“销售额/去年销售额”则是今年和去年的数据共同计算的。报表上部的查询按钮是集算报表提供的“参数模板”功能,具体做法参见教程,这里不再赘述。
首先,要提前用集算器从数据库中读取2009年等各个年份的销售数据,计算好之后,以集算器的二进制编码导出到temp2009sales.b文件中,每年一个文件。中间数据制作好之后,数据库中2009年的数据就可以移除备份了,不再占用数据库的空间。
第二,编写集算器脚本salesProportion.dfx如下:
注意,脚本的参数是:argyear(要查询的年份),argmonth(要查询的月份)。
A1:连接预先配置好的数据源demo。
A2:从数据库中计算取出要查询的年份订单数、销售额。
A3:从前一年的数据文件中取出数据。
A4:将A3中的数据按照A2中的CLIENT字段对齐,A2中有A3中没有的补空行。
A5:利用A2来生成新的续表。其中增加了A4的对应行数据,比如A4(#).C:lastCOUNT就是A4的对应行(#是A2的当前行号)中取出C字段。
A6:关闭数据库连接。
A7:向报表返回结果集。
第三,在集算报表中定义报表参数(argyear、argmonth)和计算数据集:
上图中,参数名是指dfx定义的参数名称,参数值是指报表提交给集算引擎的值。这里是将报表的两个参数的值传递给集算器的同名参数。
第四,设计报表,如下图:
输入参数计算后,即可得到前面希望的报表。