具有多个实例的数据库访问
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等
【讨论】:
以上是关于具有多个实例的数据库访问的主要内容,如果未能解决你的问题,请参考以下文章