【发布时间】:2017-08-03 10:55:20
【问题描述】:
我们在 Azure Web 应用程序中运行一个 Web 应用程序,每个客户使用一个数据库(每个客户有多个帐户)。登录时,我们将用户连接到正确的客户数据库。该数据库也托管在 azure(弹性池)中。它与 Web 应用程序托管在同一区域(西欧)。
连接池化后,请求时间很快,但用户第一次登录时,仍需要创建连接,这需要(安静)很长时间。
连接字符串是使用 SqlConnectionStringBuilder 构建的。
var csb = new System.Data.SqlClient.SqlConnectionStringBuilder();
csb.DataSource = "tcp:******.database.windows.net,1433";
csb.InitialCatalog = "***-***-***";
csb.UserID = "**-**";
csb.Password = "**********";
csb.MultipleActiveResultSets = true;
csb.Encrypt = true;
csb.PersistSecurityInfo = false;
csb.TrustServerCertificate = false;
csb.ConnectTimeout = 30;
_connectionString = csb.ConnectionString;
// Data Source=tcp:******.database.windows.net,1433;Initial Catalog=***-***-***;Persist Security Info=False;User ID=**-***;Password=******;MultipleActiveResultSets=True;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False
我做错了吗?或者 azure 中是否有一些设置可以加快连接过程?
上述请求显示了对客户应用程序的第一个请求。因此,它包括 EF 迁移种子,导致前 2 个查询实际上并未进入数据库本身,而是对数据库进行了相当多的查询(此处未显示全部)。
【问题讨论】:
-
我不知道连接花费了多长时间,以及连接所花费的时间还是 EF 迁移所花费的时间。你能澄清这些观点吗?
-
@DavidBrowne-Microsoft:我不知道我是否理解正确。但是图表(图像)我相信与数据库的连接是在空白处创建的。右侧的实际绿色(和一个红色)条是为数据库播种的第一个查询。我认为前两个是为了数据库的存在。该图像是来自 Application Insights 的屏幕截图。
-
我 99% 确定您看到了现代建筑等方面的 EF 开销。在我使用这种模式的系统中,我有一个应用程序启动循环,它在每个应用程序上调用 init 方法客户数据库,以确保生成模型并应用更新。
-
您所说的开销是什么。数据库是表创建吗?因为数据库和表已经填充。我确实使用代码优先迁移,并且所有迁移都已应用。我相信正确的部分是某些值的播种(addorupdate 命令)。 Localy,一切都很快,我没有时间差距。连接到 azure 数据库时,我确实有同样的问题。所以我认为它不应该是应用程序服务器,但问题在于连接或 azure sql 本身。
标签: entity-framework azure azure-sql-database