使用Apache Calcite进行JDBC多数据源关联
如果熟悉阿里巴巴数据库管理dms平台的朋友可能知道,在dms上可以使用一条SQL语句查询进行跨库查询并将多个数据库的数据关联起来。
如上图所示的场景,可以使用Apache Calcite实现。Calcite的简单介绍可以看一看这篇文章。Calcite的基本概念可以参考这篇文章 。Calcite的JDBC Adapter也提供了开箱即用的这些功能实现,虽然要实现像dms这样的商用系统功能,需要对calcite进行很多扩展,但是calcite强大的地方就在于它是一个易于扩展的动态数据管理框架。
准备工作
在使用Calcite进行 多数据源查询之前,先准备两个数据库。比如一个数据库使用mysql,另一个使用postgresql。在这两个数据中都保存两个表:student
和colleage
。
- student表有三个字段:
id
,name
,cid
。 - colleage表有两个字段:
id
,name
。 - student表与colleage表的数据可以通过
student.cid = colleage.id
关联起来。
mysql数据库中的测试数据如下:
postgresql中的测试数据如下:
希望尝试例子和查看例子中完整代码可以访问例子的github库
JDBC单一数据源查询
首先尝试使用Calcite的JDBC Adapter连接mysql这单一数据源进行SQL查询。
在使用Calcite的数据源Adapter之前都要定义该数据源的Schema,每种数据源的Adapter根据实现的不同会有不同的Schema,Calcite支持yaml和json两种格式。在这里我们使用的是Calcite的JDBC Adapter,所以需要定义JDBC Adapter Schema.
{
"defaultSchema": "db1",
"schemas": [
{
"factory": "org.apache.calcite.adapter.jdbc.JdbcSchema$Factory",
"name": "db1",
"operand": {
"jdbcDriver": "com.mysql.cj.jdbc.Driver",
"jdbcPassword": "changeme",
"jdbcUrl": "jdbc:mysql://localhost:3306/test",
"jdbcUser": "root"