2014-01-30 79 views
0

當使用實體框架連接到SQL Server 2012 Express默認實例時,我看到奇怪的超時行爲 - 在5.0.0和6.0.0上測試過。實體框架代碼使用默認SQL實例時的第一次超時

如果我使用服務器,通過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" /> 

而且任何的ConnectionString主機名需要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

的CommandTimeout控制它等待一個特定的命令來執行(一個SELECT例如)的時間;當服務器不可達並且沒有命令發送時它不會有任何影響。 嘗試ConnectionTimeout看看它是否有任何區別。

+0

感謝您的快速響應。正如我在文章中提到的,我在所有測試中都設置了「連接超時= 5」。 – FrancoisG

+0

我沒有滾動查看連接字符串的結尾。我的錯。嘗試從代碼中設置它並查看行爲是否有所不同?否則我不知道還有什麼要說:) –

+0

由於'context.Database.Connection.ConnectionTimeout'是隻讀的,似乎無法找到在代碼中設置它的方法。但是,它確實反映了連接字符串中設置的「Connection Timeout = 5」。無論如何感謝@AZ。 :d – FrancoisG