Entity Framework Code Первые таймауты при использовании экземпляра SQL по умолчанию

Я наблюдаю странное поведение при тайм-ауте при подключении к экземпляру SQL Server 2012 Express по умолчанию с использованием Entity Framework - проверено на 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" />

If I add a port, it takes 42 seconds:

<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" />

And any connectionstring with hostname takes 14 seconds, but if DNS resolves and host is offline; or online host doesn't have a SQL instance, it's back to 73 seconds e.g.

<connectionStrings>
<add name="TestContext" connectionString="Server=dev-pc;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />

I have tried:

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"){}           
    }
}

Вопросы:

Это ожидаемое поведение Entity Framework (или базового поставщика)?

Какой тайм-аут следует в этой ситуации?

Поскольку 73-секундный тайм-аут слишком велик, что можно сделать, чтобы ускорить обнаружение автономных узлов SQL?

Будем признательны за любые другие комментарии или предложения.

Спасибо,

Франсуа


person FrancoisG    schedule 30.01.2014    source источник


Ответы (1)


CommandTimeout контролирует время ожидания выполнения определенной команды (например, SELECT); это не повлияет, если сервер недоступен и команда не отправлена. Попробуйте ConnectionTimeout и посмотрите, имеет ли это значение.

person Adrian Zanescu    schedule 30.01.2014
comment
Спасибо за быстрый ответ. Как я уже упоминал в своем посте, я выставлял Connection Timeout=5 во время всех тестов. - person FrancoisG; 30.01.2014
comment
Я не прокручивал, чтобы увидеть конец ваших строк подключения. Виноват. попробуйте установить его из кода и посмотреть, отличается ли поведение? в противном случае я не знаю, что еще сказать :) - person Adrian Zanescu; 30.01.2014
comment
Кажется, не удается найти способ установить его в коде, поскольку context.Database.Connection.ConnectionTimeout доступен только для чтения. Однако он отражает Connection Timeout=5, установленный в строке подключения. В любом случае спасибо @AZ. : D - person FrancoisG; 30.01.2014