首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理只读数据库时的数据延迟?

处理只读数据库时的数据延迟?
EN

Software Engineering用户
提问于 2017-05-17 18:27:24
回答 4查看 1.3K关注 0票数 2

我们的Web应用程序是C#/MS,我们的DBA希望我们使用两个数据库,一个是可写的,一个是只读的。用于写入的数据库将复制到只读副本。这个问题也适用于其他语言。

这样做的原因(来自DBA)是因为如果/当表在写过程中被锁定时,性能不会受到影响。

我们正在试图确定最好的方法,让我们的Show/Get方法只使用fresh,但同时确保如果只有一个写操作,我们有新的数据。其中一项建议是使用ReadOnlyToWritableData连接,但是为什么要使用Readonly数据库。

已经使用的一些解决方案是什么?我四处搜寻,却找不到任何确定的东西。

更新:我被告知,我们的DB模式是一个“总是在可用性组”。https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server我可能需要做更多的研究。

EN

回答 4

Software Engineering用户

发布于 2017-05-17 21:53:11

这是一个可用性组设置,其中应用程序写入数据库的一个实例,并从另一个实例读取数据。它是数据库切分,这并不是一种罕见的做法,对于具有极高读写操作的数据库来说,这是一种常见的做法。这就是如何维护大规模web应用程序(电子商务)的可伸缩性。

这一问题的一个例子可以从手推车上看到。用户将项目添加到购物车中,将其保存到数据库中,然后转发到下一页,该页读取购物车并显示项目。如果同步有延迟,这可能是一个问题。虽然延迟(如果环境设置正确)可能仅为几毫秒,但如果辅助数据库出现问题,则读取可以在新数据实际同步之前提取数据。

只有两种可能性:

1-对数据库侦听器和连接字符串使用应用程序意图。但是,我听说.net的SQL驱动程序没有可靠地实现这个特性(微软与微软的工作不太好)。但我不知道这是否仍然是真的。应用程序意图将自动从rw切换到ro。然而,即使实施这一点也不能解决可能出现的问题。

2-当你知道你会立即需要数据的时候,使用一个存储过程。在我们的cart示例中,添加项的过程可以返回包含购物车中当前所有项的记录集。

OP要问的是:在代码中有办法做到这一点吗?是否有人用代码(而不是存储过程答案)来执行此操作?

票数 2
EN

Software Engineering用户

发布于 2017-05-17 19:47:38

应用程序将连接到HA (高可用性)集群,而不是连接到特定的数据库实例(服务器)。集群将自动将您引导到可用的实例(主实例或辅助实例)。

因此,您的应用程序对延迟应该是透明的。注意,如果主服务器出现故障,则切换到次要服务器会有一些延迟,但是您的应用程序与集群(而不是特定实例)相反,因此集群将自动处理重定向。

票数 1
EN

Software Engineering用户

发布于 2017-05-17 21:48:26

在我看来,如果您关心性能,从数据库读取的对象也应该维护一个缓存,这样多次读取只会导致一次到数据库的旅行。如果您构建它,那么您所要做的就是编写写入数据库的对象代码,以更新缓存。这样,下一个读取操作将命中缓存并获取更多的最新数据。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/349165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档