用集算器实现跨数据库关联报表

实际应用中很多报表的数据来源于多个不同类型的数据库,报表数据源跨数据库是报表开发中的常态。目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题。

  使用报表工具自身多源关联功能

  现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利。然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定)。这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长。

  即使有的能实现,在报表中做跨库关联计算的效率也较低,远远不如数据库的性能,而且经常因为在实现过程中使用了大量隐藏行列进一步降低报表性能并加大内存占用。

  于是一般会采用下面的两种方式。

  将数据统一到一个数据库中

  将不同数据库的数据统一到一个数据库中,这种做法在各类应用中很常见,目的是使用数据库(SQL)强大的计算能力。然而,这种做法会增加额外的成本开销,将多个数据库中的数据统一到一个数据库中势必会占用昂贵的数据库空间,并造成该数据库数据过多、管理困难、压力增大等问题,而且还可能负担额外的数据库购买成本以及管理成本。另外,完成ETL迁移数据也是一份不小的工作量,对实时性要求较高的报表还得用触发器方式来做ETL(一般ETL是定时的),会严重影响原数据库的性能。

  使用高级语言实现跨库关联为报表准备数据

  基于上面提到两种方式中存在的问题,有些用户使用高级语言(Java等)编程完成跨库运算,为报表自定义数据源。这种做法的优点是灵活,理论上任何运算通过程序都能完成;缺点是太难写。很多像Java这样的高级语言缺乏对集合运算的有效支持,没有相应的类库,导致完成个简单的group也要写很多(循环)代码,更不用说关联以后还要再进行分组汇总等其他运算了。

  这种情况下,使用集算器来实现跨库关联报表就是个不错的选择。

  集算器如何实现跨库关联报表?

  我们通过一个例子来看集算器是如何快速实现跨库关联报表的。

  业务描述

  企业员工每月应发工资跟员工的基本工资、考勤以及绩效有关,考勤信息来源于人力部门的考勤系统(hsql数据库),基本工资和绩效信息则存储在财务系统(mysql数据库)中。需要将这两类信息合起来计算员工的工资。

  实现步骤

  编写脚本(crossDB.dfx)完成跨库关联计算,为报表准备数据

  

  在A1、A2中通过connect分别连接hsql和mysql数据源

  在A3、A4、A5中通过query语句分别从两个数据库中取出用到的数据,此时数据已全部取出,不再需要与数据库交互,在A6、A7中关闭两个数据库连接

  在A8中使用join完成三表的连接

  在A9中计算应发工资,算法为:基本工资*(1-考勤系数+绩效系数)

  最后通过A10的result生成供报表使用的结果集

  报表调用集算器脚本完成报表展现

  集算器的类包封装成标准的JDBC,允许报表工具以类存储过程的调用方式调用集算器脚本,如本例中在报表工具中像配置数据库连接一样配置起好集算器的JDBC,然后建立存储过程数据集后使用 call crossDB()即可完成调用。

 这里以BIRT为例说明调用过程:

  1、 复制集算器JDBC驱动包到相应目录

  2、 配置报表数据源

  

  3、 设置DataSet,调用集算器脚本

  

  简单几步完成调用,BIRT即可使用集算器的计算结果直接展现输出。

  结语

  通过这个例子可以看到,集算器擅长完成跨库计算,并将计算后的结果以标准ResultSet方式返回为报表提供数据源,而报表采用类存储过程调用的方式调用集算器脚本非常简单。

  还有一个重点需要关注,就是价格。集算器是个需要付费的商业软件,好在只针对大数据的集群才收费,用作报表数据源功能是免费的,不需要增加成本就能轻松解决多数据库关联报表问题。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-08 15:20:33

用集算器实现跨数据库关联报表的相关文章

集算器访问数据库的配置

集算器支持包括数据库在内的多种异构数据源.这里,我们通过例子来看一下集算器访问数据库的方法. 集算器可以连接数据库的jdbc驱动,也可以通过jdbc-odbc桥连接数据库.由于版权的原因,使用集算器的程序员需要自行准备数据库的jdbc或者odbc驱动.Jdbc驱动jar包准备好之后,需要放入集算器IDE安装目录的/common/jdbc中,例如:C:\Program Files (x86)\MicroInsight\common\jdbc目录中. 集算器集成开发环境的ODBC配置界面如下: 集算

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

集算器JDBC

集算器JDBC 类似一个不完整的数据库JDBC驱动,它不带物理表,可将集算器视为只有存储过程的数据库(较强的计算能力,较弱的存储机制).与使用数据库JDBC非常类似,可以像调用存储过程一样调用集算器程序.不同的是,集算器JDBC是个完全嵌入式计算引擎,所有运算都在这个嵌入包中完成,而不象数据库那样还有一个独立的服务器来实施计算. 1.加载驱动jar 集算器JDBC所需jar包括:dm.jar.poi-3.7-20101029.jar.log4j_128.jar.icu4j_3_4_5.jar.d

集算器协助java处理结构化文本的集合运算

JAVA不直接支持集合运算,因此要用嵌套循环才能实现文本文件之间的交集.并集.差集 等集合运算,如果文件数量较多,或者文件较大而无法放入内存直接计算,再或者要按照多个字段进行集合运算,则相应的代码会更加复杂.集算器直接支持集合运 算,可以协助JAVA轻松实现此类算法,下面我们通过例子来看一下具体作法. 有两个小文件:f1.txt和f2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算.部分数据如下: 文件f1.txt: 文件f2.txt: 集算器代码: A1.B1:用import

集算器协助java处理结构化文本之对齐连接

文本文件emp.txt存储着员工信息,EId等于1的员工不在该文件中.文本文件sOrder.txt存储着订单信息,其SellerId字段和emp中的EId字段相对应,SellerId等于2的订单不在该表中.部分源数据如下: emp.txt: sOrder.txt: 现在需要将emp的Name.Dept.Gender这三个字段对齐到sOrder中,计算结果输出到新文件中.期望的计算结果如下: 集算器代码: A1格和A2格分别从文本文件中读取数据,并存入两个变量emp和sOrder.这里使用了函数i

SQL跨数据库服务器查询和跨表更新的操作

SQL Server数据库跨数据库服务器查询和跨表更新的相关知识是本文我们主要要介绍的内容,接下来我们就通过一个实例来介绍这一过程.实例是这样的:想实现的功能很简单, 在我的本地一个表用来保存省的信息: T_Province,在另外一台服务器上也有一个保存省的表province,其中有我本地没有的provience_name_en和provience_id信息.我希望将它们保存到我的表中. 准备工作 首先我在本地 T_Province 表中添加了 ProvinceNameEn 和 Provinc

MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问_Mysql

跨数据库服务器,跨实例访问是比较常见的一种访问方式,在Oracle中可以通过DB LINK的方式来实现.对于MySQL而言,有一个FEDERATED存储引擎与之相对应.同样也是通过创建一个链接方式的形式来访问远程服务器上的数据.本文简要描述了FEDERATED存储引擎,以及演示了基于FEDERATED存储引擎跨实例访问的示例. 1.FEDERATED存储引擎的描述   FEDERATED存储引擎允许在不使用复制或集群技术的情况下实现远程访问数据库   创建基于FEDERATED存储引擎表的时候,

sql跨数据库查询方法

数据库教程1:AAA 数据库2:BBB 数据库名和表名之间放两个点   select * from [AAA]..TableA a inner join [BBB]..TableB b on a.AcountID = b.ClientID 注意:必须是单个Sql实例! 你要知道跨数据库访问的语法,如下: select * from openrowset('sqloledb','DRIVER={SQL Server};SERVER=服务器地址;UID=sa;PWD=密码', 数据库名.dbo.表名

帝国cms和discuz论坛系统跨数据库查询调用

现在大多数资讯类系统,一般站长都比较青睐php.mysql组合,这类cms系统中以dede和帝国更为普及,在帝国系统中调用论坛数据,这个应用需求比较常见,cms和论坛系统使用同一数据库时,这样调用时,使用帝国论坛上提供的方法,如果是dede网站系统,使用dede的后台向导就可以直接实现,但如果cms和论坛使用不同的数据库,前提是在同一服务器.同一mysql服务环境下,就不能直接调用了,这涉及到mysql用户的多数据库权限,以及mysql的跨数据库查询问题. 这个问题很久以前就曾经多次在帝国论坛咨