语义模型中可以引用数据字典、仓库元数据、语义模型,其中数据字典一直走执行数据源取数,仓库元数据、语义模型是走其本身的执行数据源取数,这样语义模型就存在跨数据源取数问题。语义模型最终都会转化为 sql 进行数据查询,跨库时如何执行 sql 呢?
针对上述问题,语义模型采取的是最常用的方案,即把其他数据源上的数据复制到主数据源上,再执行 sql 。 跨数据源查询的总体流程图如下所示:
其中,如何跨库复制数据是关键。 对此,我们提供两种实现方式,并且系统可根据当前执行环境动态决定使用何种方式。
JDBC 方式
针对主数据源外的其他数据源,我们分别在其上执行相应查询,获得结果数据。据此结果数据的元数据,我们在主数据源上创建临时表,然后把上述结果数据加载到内存,再构造 insert 语句依次插入临时表中。如果数据量太大时,一次加载到内存会给服务器产生较大压力,此时可采用分页处理,分批次加载数据到内存,分批处理数据。
数据库直连方式
如果源和目标数据源数据库类型相同,我们可采用数据库层面的远程数据库连接方式来处理。各主要数据库产品都提供了相应技术方案,分别介绍如下:
Oracle :提供 DBLink 方式建立远程数据库连接,其语法如下:
CREATE DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘ 本地配置的数据的实例名 ’
然后就可用标示 表名 @ 数据库链接名 来指代远程数据库上的表,像使用本地表一样来使用这些远程表。
DB2 :提供联邦数据库技术来建立远程数据库连接,其创建步骤有: 安装用于数据源的包装器 、标识数据源、为远程表定义别名 等。(这块定义较复杂,具体可参见 DB2 相应帮助文档)
SQL Server :提供存储过程方式来建立远程数据库连接。其语法如下:
sp_addlinkedserver
[ @server = ] 'server',
[ @srvproduct = ] 'product_name',
[ @provider = ] 'provider_name',
[ @datasrc = ] 'data_source',
[ @location = ] 'location',
[ @provstr = ] 'provider_string',
[ @catalog = ] 'catalog'
数据库直连方式在大数据量下效率优势明显,并且其充分利用数据库端的性能,对应用服务器基本无压力。
实现数据复制的流程图如下: