我有一个azure的数据库,它有标准的s2版本。在我的应用程序的日志中,我总是看到很多例外的格式:
1
System.Data.SqlClient.SqlException:由于登录前连接初始化过程中的错误,客户端无法建立连接。可能的原因包括:客户端尝试连接到不受支持的SQL Server版本;服务器太忙,无法接受新连接;或者服务器上存在资源限制(内存不足或允许的最大连接数)。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。)---> System.ComponentModel.Win32Exception:远程主机强行关闭现有连接
2
System.Data.Entity.Core.EntityException:底层提供程序在Open上失败。 ---> System.InvalidOperationException:超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池化连接都在使用中并且达到了最大池大小
3
System.Data.SqlClient.SqlException(0x80131904):由于登录前连接初始化过程中的错误,客户端无法建立连接。可能的原因包括:客户端尝试连接到不受支持的SQL Server版本;服务器太忙,无法接受新连接;或者服务器上存在资源限制(内存不足或允许的最大连接数)。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。)---> System.ComponentModel.Win32Exception(0x80004005):远程主机强行关闭现有连接。
我使用SqlAzureExecutionStrategy,因此在经过一些重试后会抛出这些异常。
我在azure portla上看到了不同的性能指标,但似乎没问题。
如何识别问题?
答案 0 :(得分:1)
我认为您的数据库负载太重,或者您有一些仍在运行或未放弃连接的查询。
我使用此查询来查看正在运行的内容:
SELECT (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)
ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement,
s1.* FROM sys.dm_exec_requests s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
ORDER BY 1
查看您是否仍在此处运行查询,或密切关注Azure门户中的CPU使用情况。
S2数据库不是特别好,它会限制你的请求,所以如果你做了很多(甚至很小的),它可能会拒绝它们。
您的重试策略也可能会使问题变得更糟,但是当它已经填满时会向它发出更多请求。如果是这种情况,您可以尝试使用指数退避。
答案 1 :(得分:0)