Azure sql数据库相关异常

时间:2016-08-22 13:41:57

标签: c# sql-server azure azure-sql-database

我有一个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上看到了不同的性能指标,但似乎没问题。

如何识别问题?

2 个答案:

答案 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)

所有这三个都可以通过您的连接池设计来解释。您是否正在重新使用您的连接,或者是否每次调用数据库都会打开它自己的连接?您是否在每个DBContext结束时关闭连接?您是否正在实施任何类型的缓存层,以尽量减少到数据库的往返次数?

这是一种查看池是否存在问题的方法。从门户网站转到相关数据库,查看资源利用率图表,然后点击编辑。

Default resource graph

然后从选择列表中添加会话百分比和工作人员百分比,然后单击“确定”。

Resource graph choices

如果您的合并是一个问题,您会发现您的会话和工作人员百分比很高,并且可能会在一段时间内以100%挂钩。如果你达到100%,你可以被拒绝新连接最多5分钟,直到当前的会话和工作人员完成或被杀死。