报表应用的计算中间层

http://blog.runqian.com.cn/?p=1306

在传统的报表应用中,源数据的计算一般有三种方式:1、报表工具直接连接数据库取数,源数据的计算是提交SQL由数据库完成的;2、报表工具利用自身的计算能力(单元格函数或格间计算),实现部分数据计算;3、报表工具通过API调用Java程序实现数据计算。

  下面,我们比较一下这三种方式,并探讨最佳方案。

  首先来看数据库计算。

  数据库计算的优势是:数据一致性较好,安全性较高。

  但是,采用数据库计算报表源数据的问题也比较多:

  1、报表工具从数据库中取出数据时,要通过JDBC,因为需要做数据流的对象转换,所以关系数据库的JDBC都比较慢,这是一个始终没有解决的问题。

  2、简单SQL语句执行的速度较快,但复杂SQL则不容易优化。如果是存储过程中用for循环来fetch计算的话有可能要比Java慢。

  3、数据库是扁平结构,不能以多级目录的形式来管理数据,只适合管理数量较少的表。数据库计算会产生大量相互关联的中间表,出现很多容易混淆的表名,可管理性较差。

  4、Sql存在不支持分步计算集合化不彻底缺乏有序集合不支持对象引用的问题。这就造成SQL和存储过程不符合自然思维习惯,编程比较困难。

  5、数据库的建设和维护成本都比较高。

  第二来看报表工具计算。

  由于数据库计算方案的上述不足,很多报表程序员会直接利用报表工具的单元格函数和格间计算等方式来实现源数据计算。

  报表工具计算的不足表现为:1、为了完成计算,报表不得不采取隐藏行列的方式储存中间结果,会增加内存消耗,降低性能;2、报表单元格除了存储单元格值,还保留了很多显示格式属性(比如:字体、大小、背景色等等),带着这些属性计算,也会降低性能;3、有些复杂计算是报表工具本身无法完成的,比如:不规则运算、需要多个步骤完成的计算等。

  第三来看Java程序计算。

  Java程序计算的优势是在数据库和报表工具之间形成了中间计算层,好处是:1、可以访问文件中的数据,并采用多线程计算,能够提升报表性能和容量;2、支持多样性数据源;3、有效减轻数据库负担;4、实现T+0大数据实时查询,可以在报表中看到最新产生的数据。但是,由于Java程序在结构化和半结构化计算方面的类库较少,实现上述计算很复杂。而且,Java程序和报表模板是分离的,在代码管理上也很麻烦。如果是对数据集的少量调整计算,也要折腾Java的开发环境、代码管理、打包部署等,就太麻烦了。

  因此,Java程序计算实际上形成了报表应用的计算中间层,是三个方式中比较具备优势的。但是,Java程序计算问题也还是很多。

  可以考虑采用润乾集算报表的源数据计算方案,可以在报表应用和数据库之间形成显式的计算中间层,具备上面所说的Java程序的4个优势。同时,集算报表又解决了Java程序计算的不足,体现在:1、集算脚本提供了大量的结构化和半结构化计算类库,特点是:分步计算、完全的集合运算、有序集合运算和对象引用机制等,更接近自然思维,编程更简单,代码量更少。2、集算脚本可以直接在报表文件中编写,也可以保存为dfx文件和报表文件成对存放在目录中,代码管理简单。3、集算脚本是解释执行的,无需编译、打包。4、集算脚本封装了Java的多线程编程,化繁为简,提高了开发效率。

  润乾集算报表和传统方案的结构对比示意图如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值