在分布式架构中,往往会经常遇到跨数据库查询的场景,即两个有关联的表不在一个数据库中。
一般的解决方案有:

分别查询两张表的数据,业务层进行数据合并处理
弊端:麻烦,复杂查询条件无法实现分页查询
优点:实时保证数据一致性
定时job,定时查询两张表数据或调用接口获取两张表数据,合并保存到一张表中或者MongoDB等数据库中,然后从这张表或MongoDB中进行查询
弊端:无法保证数据强一致性,适用于最终一致性的场景,定时job出错无法保证数据同步成功
优点:能实现复杂条件的分页查询
第三种就是我们要讲的创建dblink实现跨库查询,创建本地数据库对远端数据库的dblink后,就可以像操作本地数据库一样操作远端数据库,这是Oracle给我们提供一个功能,让我们的跨库查询变得非常简单便捷。
优点:就像操作本地数据库一样,支持分页,保证查结果数据强一致性
缺点:微服务中,每个服务返回的数据都是经过处理的,跨数据库查询出来需要对数据重新处理

使用dblink
1.查看用户是否有创建dblink的权限(一般管理员用户SYS都有权限)

select * from user_sys_privs t where t.privilege like upper('%link%');
  1. 如果创建全局 dblink,必须使用 systm 或 sys 用户,在 database 前加 public

    CREATE PUBLIC DATABASE LINK 数据库链名称 CONNECT TO 登录用户名 IDENTIFIED BY 密码 USING '(DESCRIPTION =

     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 对方Oracle服务器的IP地址)(PORT = 端口号))
     )
     (CONNECT_DATA =(SERVICE_NAME = 对方Oracle服务器服务名) )

    )'

注:数据库链名称指添加到本地Oracle数据库控制台(Oracle Enterprise Manager Console)树节点的服务名

要查询对方数据库的表TableName语句如下:
SELECT 字段名 FROM TableName@数据链名称;
删除DBLINK

DROP DATABASE LINK [name];  

DROP PUBLIC DATABASE LINK [name];  

使用dblink进行查询
SELECT * FROM 远程数据库表名@dblink名;

select * from user@dblink;
Last modification:March 26, 2022
如果觉得这篇技术文章对你有用,请随意赞赏