Я разрабатываю настольное приложение для анализа текста, которое интенсивно запрашивает локальную базу данных (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))
{
...
}
}
}