Azure SQL 无服务器未在连接尝试时唤醒
Azure SQL serverless is not waking up on connection attempt
我正在测试 Azure SQL 无服务器和 SSMS,它似乎工作正常,但在我的 ASP.NET 核心应用程序中它永远不会唤醒。
使用 SSMS,我可以打开一个与休眠的无服务器 SQL 数据库的连接,并在延迟后连接将通过。
使用我的 ASP.NET 核心应用程序,我尝试了同样的方法。我尝试从登录页面登录,这会打开到数据库的连接。 10 或 11 秒后(我查看了默认超时,它应该是 15 秒,但在这种情况下,它似乎总是大约 10.5 秒 +/-0.5 秒)。根据文档,第一次连接尝试可能会失败,但随后的连接尝试应该会成功,但我可以向数据库发送多个查询,但它总是失败并出现以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Database 'myDb' on server
'MyDbSvr.database.windows.net' is not currently available. Please retry the connection later. If the
problem persists, contact customer support, and provide them the session tracing ID of
'{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'.
如果我使用 SSMS 唤醒数据库,那么登录网页可以连接到数据库并成功。
我已将 Connect Timeout=120;
添加到连接字符串。
连接确实发生在控制器上标记为异步的 HTTP 请求期间,我想我不知道这是否有任何区别。
我是不是做错了什么或者我需要做些什么才能唤醒数据库?
[更新]
作为额外的测试写了以下测试
void Main()
{
SqlConnection con = new SqlConnection("Server=mydbsvr.database.windows.net;Database=mydb;User Id=abc;Password=xyz;Connect Timeout=120;");
Console.WriteLine(con.ConnectionTimeout);
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "select getdate();";
Console.WriteLine(cmd.ExecuteScalar());
}
得到同样的错误。
我想出来了,这是最愚蠢的事情。
这个 Azure SQL 服务器实例是从另一个订阅迁移过来的,迁移它的组给了它一个新名称,但他们做了一些允许也使用旧名称的事情。我正在研究如何做到这一点。当我发现那是什么时,我会更新这个答案。
事实证明,对无服务器数据库使用旧名称不会唤醒数据库。不知道为什么。但是,如果您更改为使用 new/real 服务器名称,它就可以工作。您必须添加重试连接,因为前几次连接可能会失败。
[更新]
新服务器允许使用旧名称登录,方法是使用 Azure SQL 数据库别名 https://docs.microsoft.com/en-us/azure/sql-database/dns-alias-overview
我正在测试 Azure SQL 无服务器和 SSMS,它似乎工作正常,但在我的 ASP.NET 核心应用程序中它永远不会唤醒。
使用 SSMS,我可以打开一个与休眠的无服务器 SQL 数据库的连接,并在延迟后连接将通过。
使用我的 ASP.NET 核心应用程序,我尝试了同样的方法。我尝试从登录页面登录,这会打开到数据库的连接。 10 或 11 秒后(我查看了默认超时,它应该是 15 秒,但在这种情况下,它似乎总是大约 10.5 秒 +/-0.5 秒)。根据文档,第一次连接尝试可能会失败,但随后的连接尝试应该会成功,但我可以向数据库发送多个查询,但它总是失败并出现以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Database 'myDb' on server
'MyDbSvr.database.windows.net' is not currently available. Please retry the connection later. If the
problem persists, contact customer support, and provide them the session tracing ID of
'{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'.
如果我使用 SSMS 唤醒数据库,那么登录网页可以连接到数据库并成功。
我已将 Connect Timeout=120;
添加到连接字符串。
连接确实发生在控制器上标记为异步的 HTTP 请求期间,我想我不知道这是否有任何区别。
我是不是做错了什么或者我需要做些什么才能唤醒数据库?
[更新] 作为额外的测试写了以下测试
void Main()
{
SqlConnection con = new SqlConnection("Server=mydbsvr.database.windows.net;Database=mydb;User Id=abc;Password=xyz;Connect Timeout=120;");
Console.WriteLine(con.ConnectionTimeout);
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "select getdate();";
Console.WriteLine(cmd.ExecuteScalar());
}
得到同样的错误。
我想出来了,这是最愚蠢的事情。
这个 Azure SQL 服务器实例是从另一个订阅迁移过来的,迁移它的组给了它一个新名称,但他们做了一些允许也使用旧名称的事情。我正在研究如何做到这一点。当我发现那是什么时,我会更新这个答案。
事实证明,对无服务器数据库使用旧名称不会唤醒数据库。不知道为什么。但是,如果您更改为使用 new/real 服务器名称,它就可以工作。您必须添加重试连接,因为前几次连接可能会失败。
[更新]
新服务器允许使用旧名称登录,方法是使用 Azure SQL 数据库别名 https://docs.microsoft.com/en-us/azure/sql-database/dns-alias-overview