具有多个实例的数据库访问

Posted

技术标签:

【中文标题】具有多个实例的数据库访问【英文标题】:Database access with multipe instances 【发布时间】:2021-08-26 12:44:26 【问题描述】:

说明

我有一个 ASP.Net Core 应用程序的多个实例,它使用一个 MariaDb 数据库。

多个实例是同一个 ASP.Net Core 应用程序的复制,以实现横向性能扩展。

应用程序对数据库有一些写入(100 次写入/秒),需要检查一个表中两个列的唯一约束。

我们可以将这些约束添加到数据库本身、存储过程中或使用 EF Core 的应用程序中。

示例

例如,我们启动一个事务,查询一些数据以检查约束,写入数据并提交事务。我们每秒从应用程序的不同实例总共执行 100 次。

问题

    在使用 ef core 的应用程序中检查这些约束是常用的方法吗? 我们会遇到麻烦,例如使用这种方法的不一致或中断的记录吗?

【问题讨论】:

SQL 数据库通常官方支持外键等约束。像这样:w3schools.com/sql/sql_check.asp 通常,您不必使用 C# 检查数据。我想对你来说最好的做法是使用纯数据库层事务而不是通过 C# 代码检查它。 @Anduin 感谢您的回答。 check 语句非常有用,但在我的情况下,我需要检查关于多个列的唯一约束。我更新了问题。 【参考方案1】:

由于任何 SQL 指令的大部分都是开销(网络、解析、优化等),因此请尽量减少查询次数。

另一方面,如果这会导致复杂性增加,那么该建议可能会适得其反。

如果表上有两个UNIQUE 索引就足够了,那么就这样做。这样可以将其简化为单个 SQL,而不是您提出的多语句想法。

在尝试INSERT 之后检查“dup key”不是到服务器的往返,所以它很便宜。

听起来INSERT IGNORE 几乎就足够了。

如果您需要在多线程应用程序中进行适当的数据完整性事务,那么请务必使用此类。

请为表和写语句提供 SHOW CREATE TABLE。另外,它是使用 HDD 还是 SSD 驱动器?有许多优化可能让它的速度超过 100/秒。但是我们不能在不讨论具体情况的情况下给你一个有用的答案。目前尚不清楚“多个实例”是否意味着多个线程访问单个表、多个线程访问多个表,甚至是单个服务器上的多个 MariaDB 实例(在 VM 或 Docker 中)。

一些要加速的东西:IODKU、批量插入、人为添加BEGIN+COMMIT等

【讨论】:

以上是关于具有多个实例的数据库访问的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 以一对多关系访问实例与获取请求?

Qt:如何在模型/视图设置中同步对来自多个线程的数据的访问?

访问DOM中具有相同名称的多个项目[重复]

访问具有相同架构的多个数据库

多个核心数据实例

如何从 MongoDB 中具有多个集合的数据库中访问单个集合数据