最近遇到这个问题,大家比较纠结。今天我们首先说说为什么会有dblink这个需求。从前因为要解决两个Oracle数据库之间的数据关联。因为两个数据库是不同的IP,数据关联要跨网络的。网络的消耗很大。所以这种方式不推荐,甚至是反对。有没有办法能避免跨网络查询?答案是有的:通过物化视图把数据进行本地的落地。这样两个数据库直接的数据只在间隔时间内进行一下差异补偿。
不过这个又带来一个问题,如果要同步的表很多怎么办?这一个两个的还行。多了实在不行。我见过50个表5秒同步一次。数据库压力很大。最终采用了OGG的方式替代物化视图,两边数据库压力都下降了40%。
可见即使是同构数据库跨网络效果也不好。(再次说明单机是多么幸福的一件事)
那么以上说的都是从前,而现在情况有变。在PDB模式下,dblink没有网络开销,是不是可以了呢?技术上可以。不过又引申出来一个问题。就是使用dblink查询时候显示有事务。为什么呢?因为要求各个数据库之间的一致性。今天我们看看这个事务会不会带来锁。
登录第一个PDB查看数据。PDB6
登录第二个PDB查看数据。PDB7
登录第三个PDB查看数据。PDB8
在PDB8上建立到PDB6的dblink p6
在PDB8上建立到PDB7的dblink p7
根据执行计划看到了remote的远程。
在PDB8上进行查询,可以看到没有事务。
但是如果是全表查询,就显示了事务。这其中的原因暂时不明白。先放一下。
我们主要验证会不会引起锁。在PDB7上把第二行数据改一下,然后不提交。
在PDB8上,没有看到。(因为没有提交,看不到正常)
当PDB7上提交以后
PDB8可以查询出结果。
结论引用网上原话:
Oracle数据库中使用dblink的相关查询语句会产生事务,如果有大量会话使用dblink的话,会在远程数据库产生大量的会话,有时候消耗的连接数量会非常可观。对于dblink在远程数据库的会话,必须先在本地数据库的当前会话commit,然后alter session close database link xxx, 关闭dblink,如果不执行这些操作,只能靠DCD或Tcp KeepLive机制触发数据库销毁会话。
就是说会有连接数的消耗,需要应用去主动关闭,如果不主动关闭,最终数据库会来关闭。