超时已过。在 Azure sql 上完成操作之前经过的超时时间

Posted

技术标签:

【中文标题】超时已过。在 Azure sql 上完成操作之前经过的超时时间【英文标题】:Timeout expired. The timeout period elapsed prior to completion of the operation on Azure sql 【发布时间】:2015-10-03 10:35:51 【问题描述】:

我需要在 global.asax 应用程序启动事件上在 windows azure 上创建一个 sql 数据库,但是我收到了这个错误:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.  This failure occurred while attempting to connect to the routing destination. The duration spent while attempting to connect to the original server was - [Pre-Login] initialization=296; handshake=324; [Login] initialization=0; authentication=1; [Post-Login] complete=94;

我的代码如下:

   private void SetupSSM() 
            SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder
            
                UserID = SettingsHelper.AzureUsernamedb,
                Password = SettingsHelper.AzurePasswordDb,
                ApplicationName = SettingsHelper.AzureApplicationName,
                DataSource = SettingsHelper.AzureSqlServer
            ;

            bool created=DbUtils.CreateDatabaseIfNotExists(connStrBldr.ConnectionString, SettingsHelper.Azureshardmapmgrdb);
            if(created)
            
                Sharding sharding = new Sharding(SettingsHelper.AzureSqlServer, SettingsHelper.Azureshardmapmgrdb, connStrBldr.ConnectionString);
            
        



  public static bool CreateDatabaseIfNotExists(string connectionString, string databaseName)
        
            using (SqlConnection conn = new SqlConnection(connectionString))
            
                conn.Open();

                SqlCommand cmd = new SqlCommand(
                    string.Format("SELECT * FROM sys.databases WHERE [name]=\'0:S\'", databaseName),
                    conn);

                if (cmd.ExecuteScalar() == null)
                
                    SqlCommand cmd2 = new SqlCommand(
                        string.Format("CREATE DATABASE [0:S];", databaseName),
                        conn);

                    cmd2.ExecuteNonQuery();

                    return true;
                
                else
                    return false;
            
        

如何增加超时时间>?是sql超时还是因为sql没有响应而导致web请求超时?

【问题讨论】:

我在这里遇到了同样的问题。使用 Azure 搜索,并从 SQL 数据库导入数据。一段时间后总是超时。尝试增加超时时间,但没有成功。 【参考方案1】:

您可以通过执行以下操作来设置命令超时,您看到的错误是命令超时,很可能您的创建数据库需要超过 30 秒,这是默认超时值。

例如,将超时设置为 300 秒 cmd.CommandTimeout = 300

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.110).aspx

【讨论】:

..实际上我遇到了同样的问题,我的 SqlStatement.CommandTimeout 设置为 900 秒。它有时仍然会引起问题。它似乎与 Azure DB 中的 DTU 和记录数(数据库大小)有关。 BASIC 级 5DTU 2GB DB 选项似乎是最差的。出于某种原因,某些 SP 和/或查询只是在没有明显原因的情况下挂起,即使它们之前已经快速执行了很多次。我认为这可能是小型 Azure DB 的进程并发问题。 您应该检查 DTU 的使用情况并决定数据库的版本 是的,我同意,但如果数据库大小保持在限制范围内,BASIC 级别 DTU(5) 的性能应该与 PREMIUM DTU 级别一样好。 DTU 除了数据库大小之外还有其他因素,比如可用内存、cpu 等。这是基于每秒事务数 我真的希望它会如此简单,但例如现在我正在从多个数据库的同一个表中删除 100 条记录。在 13 个数据库上它没有问题地删除,在剩下的 2 个数据库上它仍然被锁定。所有 DB 都是 BASIC 5DTU,并且没有(基于用户的)并发进程在任何 DB 或根服务器上运行。两个“冻结”数据库的 DTU 百分比约为 1.79%,数据库大小为 823MB。【参考方案2】:

当我们遇到这个问题时,事实证明我们的数据库动力不足。性能监视器显示,在我们遇到错误期间,DTU 已达到极限。 Azure SQL Database Operation Timeout

【讨论】:

【参考方案3】:

作为@Satya_MSFTs 解释的补充,如果您的驱动程序支持,您可以将命令超时添加到连接字符串。这可能看起来像这样(在 ADO.NET 语法中):

_connectionString = "Server=tcp:myenv.database.windows.net,1433;Database=mydb;User ID=myuserid;Password=mypassword;Encrypt=true;Connection Timeout=120;Command Timeout=120;"

然后可以在哪里使用它,例如 inMicrosoft.Data.SqlClient.SqlConnection,如下所示:

await using var conn = new SqlConnection(_connectionString);

就像其他人所说的那样,您应该在这样做之前尝试调整您的数据库。 (不是在 OPs 的情况下。如果它是一次性设置操作,可以增加超时时间,然后在 imo 之后减少它)

【讨论】:

以上是关于超时已过。在 Azure sql 上完成操作之前经过的超时时间的主要内容,如果未能解决你的问题,请参考以下文章

.NET连接SQLServer返回数据时提示“超时时间已到。在操作完成之前超时时间已过或服务器未响应。” 附代码

超时时间已到。在操作完成之前超时时间已过或服务器未响应。

超时已过。在操作完成之前超时时间已过或服务器没有响应[重复]

超时已过。在操作完成之前超时时间已过或服务器没有响应。声明已终止[重复]

Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。

使用 SQL Azure 从会话状态提供程序(实体框架)持续接收“超时时间已过”