当我在连续循环中从数据库查询时,一段时间后出现错误:
已引发异常,可能是由于瞬态故障导致的。如果您正在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
通常情况下它都能正常工作。
当我在连续循环中从数据库查询时,一段时间后出现错误:
已引发异常,可能是由于瞬态故障导致的。如果您正在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
通常情况下它都能正常工作。
如果您正在使用EF Core,则可以配置重试失败以实现弹性连接:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("your_connection_string", builder =>
{
builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
});
base.OnConfiguring(optionsBuilder);
}
连接到 SQL 数据库时,您需要考虑短暂的连接故障。这些连接故障可能发生在更新发布、硬件故障等情况下。您看到的错误表明其中一件事情发生了,这就是为什么您的连接会断开的原因。按照 Anbuj 的建议启用执行策略应该可以解决问题。
按照此处所述的方式启用执行策略:https://msdn.microsoft.com/zh-cn/data/dn456835.aspx。在设计 Azure SQL 数据库时,您必须考虑短暂连接失败,因为后端更新、硬件故障和负载均衡有时会导致间歇性失败。
我注意到没有人提供Entity Framework而非EF core的解决方案。实现SqlAzureExecutionStrategy最简单的方法是:
Go to Context.cs file that contains: public partial class YourEntity : DbContext
add the reference: using System.Data.Entity.SqlServer;
add another class at the end of the file containing the following code:
public MyConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
}
我发布这个答案是因为在研究问题的答案时遇到了很多问题。以下是我收到的详细错误信息:
由于错误信息太长,将错误分成几部分:
经过调查,我发现这与Azure SQL数据库最大登录限制有关。我使用的是“基本”服务层,最大并发用户登录数为30。
System.Data.Entity.Core.EntityException: *已发生一个异常,可能是由于瞬态故障引起的。如果您正在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。* --->
System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参见内部异常。 ---> System.Data.SqlClient.SqlException:资源 ID:1。数据库的请求限制为 30,已达到。请参见'http://go.microsoft.com/fwlink/?LinkId=267637'进行帮助。 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)处
结论:
第一部分:按照此处提到的方式启用执行策略:https://msdn.microsoft.com/en-us/data/dn456835.aspx。
第二部分:如果价格允许,您需要升级Azure中的订阅。
谢谢。
我希望能为那些和我一样遇到了这个错误但并非在Azure或云平台上与数据库进行交互的人做出贡献。
首要目标是确定问题的确切来源,像我一样的许多人都会遭遇异常文本和一长串堆栈跟踪字符串。对我来说,处理InnerExceptions的"母巢"以获取数据库提供程序在关闭连接之前发出的真实消息(在此消息时连接处于活动状态!)非常有用。或者,如果可能,只需使用允许您检查与正在进行的TSQL操作相关的任何错误的外部工具监视与数据库之间的事务(例如SQL Server Profiler)。
在我的情况下,场景是这样的:2个相同程序的实例(它是Windows服务),这些实例将记录插入表中。有两个特点:
在这种情况下,所有服务的实例并发地尝试写入同一张表,并且每次使用EF6执行的写操作都会生成一个非常特殊的查询,其中包含用于检索和增强表示标识的键字段的选择。类似于这样:
INSERT [dbo].[People]([Name]) VALUES (@0)
SELECT [Id], [SomeId]
FROM [dbo].[People]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
我的代码是:
People entry = new People();
entry.name = "ABCD";
_ctx.Set<People>().Add(entry);
await _ctx.SaveChangesAsync();
await _ctx.Database.ExecuteSqlCommandAsync("INSERT INTO ....");
另一种方法是通过两个不涉及 EF TSQL 解析器的写操作来优化操作,并检索分配给最后添加记录的标识符。
当我尝试使用登录信息连接数据库时,如果该登录信息在数据库中没有关联的用户,则会出现此错误。
这可能是由于TLS设置引起的问题。默认情况下,.net 4.5框架不支持tls 1.2,并且新SQL数据库不兼容旧的tls版本。因此,要么在您的计算机上禁用tls 1.0、1.1,要么升级到.net 4.6.2。