连续连接数据库时出错
Posted
技术标签:
【中文标题】连续连接数据库时出错【英文标题】:Error when connect database continuously 【发布时间】:2015-07-02 15:10:46 【问题描述】:当我在连续循环中从数据库中查询时,经过一段时间 我收到一个错误:
引发了一个异常,可能是由于瞬态 失败。如果您要连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
通常它工作正常。
【问题讨论】:
检查您的服务器日志(您的 SQL Server 所在的位置)。这可能是由于您的服务器拒绝了继续请求。使用 ULS 查看器检查日志。如果是这种情况,您可能需要修改服务器设置。 我们正在使用 Azure 数据库。是否可以查看 Azure 数据库中的日志? 是的。假设您有权访问您的 Azure 环境。 那么,唯一的方法是为 Azure DB 启用执行策略。试试这个msdn.microsoft.com/en-us/data/dn456835.aspx 我在本地计算机中使用代理或 *** 从 Visual Studio 连接到远程数据库时收到此错误。 【参考方案1】:如果您使用的是 EF Core,则为弹性连接配置失败时重试:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer("your_connection_string", builder =>
builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
);
base.OnConfiguring(optionsBuilder);
【讨论】:
【参考方案2】:连接到 SQL 数据库时,您必须考虑暂时的连接失败。例如,当更新推出、硬件出现故障等时,可能会发生这些连接失败。您看到的错误表明发生了其中一件事情,这就是您的连接断开的原因。按照 Anbuj 的建议启用执行策略应该可以解决问题。
【讨论】:
“这些连接失败可能会发生,例如在推出更新、硬件故障等时。” - 我认为一定有更平凡的原因。在我们的夜间单元测试运行期间,我遇到了同样的错误 - 不仅仅是不时,但这已经导致 500 多个测试中的几个测试在每次测试运行中失败 几个月 . @O.R.Mapper 您是否解决了上述问题?我也面临同样的问题。 @JagadishaBS:不,说真的,我还没有机会与我们的一位数据库专家就此进行分析。 @O.R.Mapper 谢谢。 只是添加另一个“普通”用例,正如上面所说的那样,对于我们在 azure 上的开发服务器,我们有一个设置,如果它超过一个小时没有收到任何活动,则关闭数据库实例(以节省未使用资源的成本),因此第一个触发它的请求往往会给我们带来此类问题。【参考方案3】:启用此处提到的执行策略:https://msdn.microsoft.com/en-us/data/dn456835.aspx。在为 Azure SQL DB 设计时,您必须针对瞬时连接故障进行设计,因为后端更新、硬件故障、负载平衡有时会导致间歇性故障。
【讨论】:
【参考方案4】:我发布这个答案是因为我在研究问题的答案时遇到了很多问题。以下是我收到的详细错误消息:
由于错误太长,将错误划分为部分:
System.Data.Entity.Core.EntityException: *引发了一个异常,可能是由于暂时性故障。如果你是 连接到 SQL Azure 数据库考虑使用 SqlAzure 执行策略。 * --->
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 异常, Boolean breakConnection, Action`1 wrapCloseInAction)
经过研究发现,这与 Azure SQL 数据库最大登录次数的限制有关。我使用的是“Basic”服务轮胎,最大并发用户数是 30。
Azure 的定价层在性能上存在巨大差异。为了实现这一点,他们限制了很多性能指标,例如CPU 功率、每分钟请求数等。
这意味着,如果您超过您的层级,您的请求将开始排队,因为 CPU 功率/请求量太高而无法处理。这会导致超时,然后请求限制会随着请求等待处理而增加。最终,它达到了数据库基本上崩溃的地步。
我的经验是,较低的数据库级别,例如 S0 和 S1,动力不足,不应该用于开发或非常基本的站点以外的任何东西。
Azure 门户中有一些很棒的工具可让您调试数据库的运行情况,例如 CPU 图表、索引顾问和查询性能洞察。
以下是相关链接:
https://blogs.technet.microsoft.com/latam/2015/06/01/how-to-deal-with-the-limits-of-azure-sql-database-maximum-logins/
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-dtu-resource-limits-single-databases
结论:
第 1 部分:启用此处提到的执行策略:https://msdn.microsoft.com/en-us/data/dn456835.aspx。
第 2 部分:您需要在 Azure 中升级订阅(如果价格允许)。
谢谢。
【讨论】:
【参考方案5】:我可以看到没有人将解决方案用于实体框架,而不是 EF 核心。 实现 SqlAzureExecutionStrategy 的最简单方法是:
转到包含以下内容的 Context.cs 文件:public partial class YourEntity : DbContext
添加参考:using System.Data.Entity.SqlServer;
在包含以下内容的文件末尾添加另一个类 代码:
public MyConfiguration()
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
您可以参考this documentation了解更多信息。
【讨论】:
我正在使用 SQL Server。我应该使用 SqlAzureExecutionStrategy 吗?【参考方案6】:当我尝试连接到数据库的登录名在数据库中没有关联用户时,我收到此错误。
【讨论】:
【参考方案7】:这可能是因为 TLS 设置,.net 4.5 框架默认不支持 tls 1.2 并且新的 SQL db 与旧的 tls ver 不兼容。 所以要么在你的机器上禁用 tls 1.0,1.1 要么更新到 .net 4.6.2
【讨论】:
我们最近切换到 Windows Server 2016,它恰好也是一个 Web 服务器,管理员运行 IISCrypt 工具来修改 Windows 和 IIS 使用的密码。他们对他们禁用的东西非常激进。幸运的是,服务器只有几天的时间,我意识到发生了什么变化。不用说你的答案恰好是正确的答案。谢谢【参考方案8】:我想为那些像我一样遇到此错误的人做出贡献,即使他们不必与 Azure 上的数据库或云中的其他平台上的数据库进行交互。
首要目标是找到问题的确切根源;像我一样,许多人会与异常文本和一英里长的堆栈跟踪字符串发生冲突。处理 InnerExceptions 的 matryoshkas 以获取数据库提供程序在关闭连接之前发出的真实消息(在消息发出时处于活动状态!)对我很有用。或者,如果可能,从允许您检查与正在进行的 TSQL 操作(例如 SQL Server Profiler)相关的任何错误的外部工具监视数据库事务就足够了。
在我的情况下,场景是这样的:同一程序(它是 Windows 服务)的 2 个实例在表中插入记录。两个特点:
对于 Windows 服务,例如 Form 或 WPF 桌面应用程序,DbContext 的生命周期通常更长,并且可以将其链接到正在处理的 Form,而不是在整个项目期间保持活动状态定期刷新它以清除当时有价值的缓存的远见; 目标表有自己的自动增量(整数)键字段在这种情况下,所有服务的实例同时尝试写入同一个表,并且使用 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();
这种写法会导致两个进程并发的情况(尤其是表有5M左右的记录时),导致SQL引擎解析一个请求而取消另一个请求。调用程序的解释正是“引发了一个可能是由于暂时性故障而引发的异常。如果您正在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。”
为了解决这个问题,我不得不放弃恢复分配给新记录的增量 id,将表视为堆栈并将写入操作减少为直接插入操作:
await _ctx.Database.ExecuteSqlCommandAsync("INSERT INTO ....");
或者,可以使用不涉及 EF TSQL 解析器的两个写入操作来优化操作,并检索分配给最后添加的记录的标识符。
【讨论】:
【参考方案9】:在我的情况下,这个错误是由于缺少等待而在查询执行过程中处理上下文引起的。
【讨论】:
【参考方案10】:如果您的数据库是本地数据库,比如 WebAPI,有时您必须提供 data source=localhost 而不是 IP 地址。 我们有这样的情况,我们使用一些 VPS 并且没有将数据源设置为 localhost 会出现此错误。 所以,如果其他人经历过这种情况,它可以帮助他。
【讨论】:
这听起来像是另一个问题。与sql连接没有直接关系。 VPS 的更多问题 是的,我同意。我只是想指出,这可能是与服务器连接的另一个问题。【参考方案11】:此问题的解决方案是通过建议的答案,使用SetExecutionStrategy()
开启重试策略。还要确保从类DbConfiguration
派生,以便实体框架可以自动执行该方法。
您还想确保您的连接弹性确实有效,方法是设置一个会产生连接错误的命令拦截,以便您确认它是否有效。
More about how to handle transient connection errors
【讨论】:
【参考方案12】:尝试使用 ef core 2.2 获取 sp 结果时出现此错误 然后我尝试在我的 sp 开头使用此代码并解决了问题。
ALTER procedure [dbo].[getusers]
@param int
As
Set transaction isolation level read uncommitted
.
.
.
【讨论】:
【参考方案13】:对我来说,当 dotnet 尝试使用 ConnectionStrings 来自 appsettings.Production.json 文件。因为这个文件中的ConnectionStrings指向了生产服务器。在开发模式下重命名或删除此文件即可解决。
【讨论】:
以上是关于连续连接数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章