暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

链接Oracle DB的Strangler模式-如何做到这一点?

askTom 2017-11-14
259

问题描述

嗨,

我不是Oracle数据库的大专家,所以请原谅我摸索的描述。

我们正在使用一个系统,其中有两个使用数据库链接连接的数据库。A -> 查询和rpc-> B

有必要引入一个新的系统,让我们称之为C,它提供了一个类似的服务数据库B,但它们都需要并行运行,直到B最终被取代。

过去,在使用不同类型系统的其他情况下,我们使用了扼杀器模式。这是一种逐步迁移系统的技术,将自定义 “路由器” 放置在a和B之间。最初,它只是接受来自A的请求并将其转发给B。然后在下一步中,您引入一些逻辑来转移一些查询或调用到系统C,并像新的B一样响应。您可以增加C提供的查询和d呼叫的数量,直到可以关闭B为止。

这有意义吗?

我想知道这种模式是否可能与数据库链接?我们是否可以在a和B之间引入一个小型数据库,将其称为 “路由器”,它提供与B相同的接口,并且最初仅传递查询和调用。然后,我们可以添加一点路由逻辑来转移一些查询和调用到新的数据库,C或调用REST API代替?

我猜一个人不会简单地用Oracle数据库以外的任何东西拦截Oracle数据库链接。

专家解答

嗯,你可以做这样的事情:

-创建您的 “路由器” 数据库
-对于在B中访问的所有对象,在路由器DB中创建同义词/视图,以通过DB链接指向B中的对象,例如

create or replace view vw_b as select * from vb_b@dblink_to_b;
复制


-更新A中的DB链接以指向B
-逐步更改路由器DB中的视图/同义词以指向C,例如:

create or replace view vw_b as select * from vb_b@dblink_to_c;
复制


-完成后切换路由器数据库

当然,这在A和最终数据库之间引入了额外的网络跳跃层。这可能会减慢速度。特别是如果您有查询同时从B和C访问表。

您可以使用实体化视图将数据分阶段到路由器数据库来缓解这种情况。当然,这使得从B -> C切换对象变得更加复杂。

因此,需要考虑的另一种选择是:

C实际上需要是一个单独的数据库吗?或者它可以是B内的模式?

你可以坚持我上面描述的视图/同义词方法。但是,您只是在更新架构,而不是更改DB链接。

这避免了额外的网络往返,并将所有数据保存在一个数据库中。如果您想在旧系统和新系统中加入表,这可能会有所帮助。

但是,当然,这带来了一个更大的问题,那就是为什么您要尝试移动B -> C;)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论