设计策略:跨 2 个不同数据库查询和更新数据
Posted
技术标签:
【中文标题】设计策略:跨 2 个不同数据库查询和更新数据【英文标题】:Design Strategy: Query and Update data across 2 different databases 【发布时间】:2011-03-17 04:02:39 【问题描述】:我们有一个需求,我们需要在 2 个不同的数据库中查询数据(1 个在 SQL Server 中,另一个在 Oracle 中)。
以下是需要实现的场景:
-
查询:从一个数据库中获取数据并匹配其他数据库中的值
更新:从一个数据库中获取数据并更新另一个数据库中的对象
我们使用的技术:ASP.net、C#
我们考虑过的选项:
-
一个数据库中的暂存区
链接服务器(不能采用这种方法,因为组织范围内的政策不允许这样做)
创建网络服务
创建 2 个不同的 DAL 并对来自 DAL 中 2 个源的数据执行列表操作
我想知道处理这种情况的最佳设计策略是什么?如果是,那么这种方法的优缺点是什么
【问题讨论】:
贵组织的政策是否禁止将一个或其他数据库复制到一个单独的位置并为此创建一个链接服务器? 【参考方案1】:是否可以使用 SSIS 包在 2 个服务器之间进行数据转换并通过 ASP.Net & c# 项目或通过按需调用的计划作业来调用它?
【讨论】:
【参考方案2】:其中一个数据库的结果是否足够小以有效传递?
如果是这样,我建议将数据库视为两个独立的数据源。
如果数据集很大,那么您可能必须考虑将某种形式的 ETL 放入其中一个数据库的暂存区域。如果您需要查询从两个数据库返回最新数据,您可能会遇到问题。因为您需要进行实时 ETL。
【讨论】:
结果集通常以千为单位 您是一次查找和更新记录,还是批量(一次数千)?【参考方案3】:这里有一篇关于在 Microsoft SQL server 和 Oracle 之间执行分布式事务的文章:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1054237.html我不知道它的效果如何,但是如果它确实有效,这可能是最适合您的解决方案:
几乎可以肯定,这将是跨多个数据库服务器进行查询的最快方法。 即使同时写入两个数据库,它也应该允许真正的事务支持。【讨论】:
【参考方案4】:最好的策略是使用链接服务器,因为它是为查询和写入如上所述的异构数据库而设计的。但显然由于您提到的政策限制,这不是选择。
因此,要以最佳性能达到您想要的结果,我的建议是:
确定哪个数据库仅包含查找数据(最小数据集),您需要对其执行查询以提取信息 使用批量复制将查找数据插入到主数据库中的临时/虚拟表中(包含您要检索并返回给调用者的大部分数据) 使用存储过程或查询将临时表与主数据库中的其他表连接起来,以检索所需的数据集是否将其编写为 Web 服务的决定不会改变数据检索过程。但应考虑通过使进程尽可能靠近您的数据库服务器,无论是在同一台机器上还是在 LAN/高速连接链路内,从而从根本上减少数据传输时间的开销。
数据更新将非常简单。这只是标准的两阶段操作,即从一个阶段提取数据并更新另一个阶段。 -
【讨论】:
【参考方案5】:很难说最好的解决方案是什么。但我们有一个几乎相同的场景。
实时:
对于实时数据更新,我们使用 WebServices,因为在我们的例子中,两个不同的数据库属于不同的项目。所以每个项目都提供了一个WebService,可以用于数据检索和数据更新。这样做的好处是,只要 web 服务接口没有改变,项目就不必关心数据库结构的变化。
静态数据:
静态数据(例如员工)将被镜像,以便更快地访问。对于如此庞大的数据量,我们使用平面文件进行夜间更新。
对于静态数据,我认为明确定义数据所有者很重要。对于每条数据,应该清楚哪个数据库有原始数据,哪个数据库只有影子副本以便更快地访问。
所以静态数据在影子数据库中是只读的,或者只能通过指定的 WebServices 更新。
【讨论】:
【参考方案6】:在 .NET 代码中使用多个数据源的问题在于,您可能会面临 CRUD 操作无法通过 ACID 测试并出现数据不一致的风险。
我最倾向于关注@Will A 对您的问题的评论...
设置到删除服务器的复制,然后链接两个远程服务器。
【讨论】:
【参考方案7】:拥有多个 DAL 并在应用程序中处理它 - 数千并不是一个大数字,只有当您达到 100,000 或数百万时您才需要担心,在这种情况下您的应用程序会挂起。
使用 linq 对生成的数据集执行数据操作,而不是循环遍历它们。
【讨论】:
以上是关于设计策略:跨 2 个不同数据库查询和更新数据的主要内容,如果未能解决你的问题,请参考以下文章