Есть ли проблема с созданием различных контекстов базы данных каждый раз без использования - PullRequest
1 голос
/ 16 октября 2019

Хорошо, я хотел бы знать, что является возможными проблемами при использовании следующего подхода

CreateContextFactory().Create().QueryOpenConnectionCount();

вместо:

using (var context = CreateContextFactory().Create())
{
      openConnectionCount = context.QueryOpenConnectionCount();
}
return openConnectionCount;

, а также при наличии каких-либо проблем с чем-либонапример:

CreateContextFactory().Create().QueryOpenConnectionCount1();
CreateContextFactory().Create().QueryOpenConnectionCount2();
CreateContextFactory().Create().QueryOpenConnectionCount3();

Это потому, что у меня есть некоторые методы в классе, которые являются открытыми контекстами БД, как указано выше, я мог бы создать для них оператор using, но мне нужно было бы передать контекст для всех методов, и мне также нужно было бы реорганизовать помощника, который выполняет транзакцию, используя контекст БД (потому что он создает свой собственный контекст внутри). Так в чем проблемы с тем, чтобы код оставался таким же?

1 Ответ

1 голос
/ 16 октября 2019

Часто контекст данных «владеет» соединением, чтобы избежать необходимости постоянно извлекать его из пула и инициализировать его. Удаление контекста данных обычно удаляет это соединение.

Итак: если вы продолжаете создавать контексты данных без правильной их утилизации, вы теряете соединения, по крайней мере, до тех пор, пока GC не вмешается и не отменитбеспорядок (высвобождение неуправляемой части соединения обратно в неуправляемый пул, если является неуправляемой частью).

Это плохая вещь, что сильно ограничивает масштабируемость и увеличивает количество открытых соединений с вашим сервером базы данных. Так что да, вы должны избавиться от своих контекстов данных. Распространяя это на общий случай: вы распределяете любую IDisposable вещь, которую вы несете ответственность за , когда вы закончите с этим. Возможно, с некоторыми исключениями (HttpClient, DataTable и т. Д.).

Обратите внимание, что C # 8 имеет несколько более резкое выражение (я бы сказал, «лучше», но это субъективно; мне это очень нравится)синтаксис для этого, если ваш оператор using достигает конца текущей области (то есть до следующего }):

using var context = CreateContextFactory().Create();
return context.QueryOpenConnectionCount();

или даже с более ранним C #, вы можете упростить его и удалитьместный:

using (var context = CreateContextFactory().Create())
{
    return context.QueryOpenConnectionCount();
}
...