使用Entity Framework连接到SQL Server 2012 Express默认实例时,我看到了奇怪的超时行为 - 在5.0.0和6.0.0上测试。
如果我使用服务器,通过IP地址,即离线,EF似乎忽略连接字符串中的任何超时值。
此连接字符串总是需要73秒才能超时:
<connectionStrings>
<add name="TestContext" connectionString="Server=10.0.0.2;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />
如果我添加端口,则需要42秒:
<connectionStrings>
<add name="TestContext" connectionString="Server=10.0.0.2,1433;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />
任何带有hostname的连接字符串都需要14秒,但如果DNS解析且主机处于脱机状态;或者在线主机没有SQL实例,它可以回到73秒,例如
<connectionStrings>
<add name="TestContext" connectionString="Server=dev-pc;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />
我试过了:
context.Database.CommandTimeout = 5;
结果没有变化。这是预期的,因为它甚至没有进入查询。
这是我继承的DbContext类:
namespace Test.DataLayer
{
public class TestContext: DbContext
{
public DbSet<Person> People { get; set; }
static TestContext()
{
Database.SetInitializer<TestContext>(null);
}
public TestContext()
: base("Name=TestContext"){}
}
}
问题:
这是预期的实体框架(或基础提供商)行为吗?
在这种情况下,它会超时?
由于73秒的超时时间过长,可以采取哪些措施来加快离线SQL主机的检测速度?
任何其他意见或建议将不胜感激。
谢谢,
弗朗索瓦
答案 0 :(得分:0)
CommandTimeout 控制等待特定命令执行的时间(例如SELECT);当服务器无法访问且没有发送命令时,它不会产生任何影响。 尝试 ConnectionTimeout ,看看它是否有所不同。