描述:
我有一个连接到Azure无服务器数据库的应用程序。数据库可以处于暂停状态和联机状态。如果一小时内没有任何活动,数据库将自动暂停。这意味着当我的应用程序在暂停时尝试打开与数据库的连接时,该连接将超时并给出超时异常。
Azure在其文档中指出:
如果无服务器数据库被暂停,则第一次登录将恢复数据库并返回错误,指出该数据库不可用,错误代码40613。恢复数据库后,必须重试该登录以建立连接。具有连接重试逻辑的数据库客户端不需要修改。 source
当我尝试通过SQL Management Studio连接到数据库时,我能够获得此错误代码40613。但是,当我尝试从应用程序打开与数据库的连接时,只会收到超时异常,因此我不知道该数据库是否不可用或该数据库是否实际上正在恢复。
代码示例:
public IDbConnection GetConnection()
{
var connection = new SqlConnection(_connectionString);
try
{
connection.Open();
return connection;
}
catch (SqlException e)
{
if (e.Number == 40613)
{
//Database is resuming
}
}
finally
{
connection.Close();
}
}
例外示例:
当我运行我的应用程序并且数据库处于暂停状态时,出现此异常:Snippet of exception in Visual Studio
有人知道为什么我没有得到Azure在其文档中指出的错误代码40613吗?
实际上,当Azure数据库不可用时,您可能会收到超时错误。实际上,您可能会遇到以下错误:
您也可能会收到错误40613,但您可以捕获一些短暂的错误,如下所示:
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请与客户支持联系,并向他们提供会话跟踪ID [
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并为他们提供会话跟踪ID。 (Microsoft SQL Server,错误:40613)
•现有连接被远程主机强行关闭。
•System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参见内部异常。 ---> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:会话提供者,错误:19-物理连接不可用)
•与辅助数据库的连接尝试失败,因为该数据库正在重新配置,并且在主数据库上进行活动转换时正忙于应用新页面。
由于这些错误,并在here中有更详细的说明,因此必须在连接到Azure SQL数据库的应用程序上创建重试逻辑。
public void HandleTransients() { var connStr = "some database"; var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy( retryCount: 3, retryInterval: TimeSpan.FromSeconds(5)); using (var conn = new ReliableSqlConnection(connStr, _policy)) { // Do SQL stuff here. } }
有关如何创建重试逻辑here的更多信息。