Новое соединение для каждого запроса или одно соединение для всех запросов? (CommandBehavior.CloseConnection против CommandBehavior.Default) - PullRequest
0 голосов
/ 01 июня 2011

Я разрабатываю настольное приложение для анализа текста, которое интенсивно запрашивает локальную базу данных (MSSQLCE 3.5). Когда пользователь добавляет текст, он должен реагировать в режиме реального времени, поэтому я использую ADO.NET с чистым SQL и пытаюсь получить наилучшие результаты производительности.

Вопрос заключается в следующем: должен ли я сохранять ОДНО кэшированное соединение (в виде статической переменной или одноэлементного) и выполнять запросы с CommandBehavior.Default или мне нужно создавать новое соединение для каждого запроса и указывать CommandBehavior.CloseConnection?

Я знаю, что обычно рекомендуется закрывать соединение как можно скорее, но действительно ли я должен это делать, если может быть тысячи запросов в минуту, например, когда пользователь вставляет большой текст?

До сих пор приложение работало на CloseConnection. Теперь я попытался превратить его в CommandBehavior.Default с одним подключением. Я вижу небольшое ускорение производительности и не вижу никаких проблем в это время, но я хочу знать, есть ли какие-либо присоединенные строки, прежде чем я помещу это в развертывание.

// one cached connection for all queries
private static DbConnection _connection = null;
public static String MakeQuery()
{            
    if (_connection == null)
    {
        _connection = new SqlCeConnection(...);
        _connection.Open();
    }
    var cmd = new SqlCeCommand("...", _connection);
    using (var reader = cmd.ExecuteReader(CommandBehavior.Default))
    { 

    }
}

против

// new connection for each query
public static String MakeQuery()
{            
    using (var connection = new SqlCeConnection(...))
    {
       connection.Open();            
       var cmd = new SqlCeCommand("...", connection);
       using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
       { 
           ...
       }
    }
}

1 Ответ

0 голосов
/ 01 июня 2011

Лично, когда мне нужно много запросов подряд из не-веб-приложения, я предпочитаю использовать одно общее соединение.

Единственная проблема заключается в том, что вам нужно следить за ним, потому что он может неожиданно отключиться из-за сетевой проблемы или из-за того, что SQL-сервер решил, что лучше закрыть . То есть вы должны обрабатывать события StateChanged.

Но пул соединений включен по умолчанию в любом случае. Он должен решить все эти проблемы для вас. Да, пул добавляет накладные расходы, но он невелик.

...