#.net #database #entity-framework #entity-framework-6 #dbcontext
#.net #База данных #entity-framework #entity-framework-6 #dbcontext
Вопрос:
Мой код усеян using
блоками, которые создают экземпляры, используют и удаляют DbContext
объект. Улучшит ли это производительность, если я передам открытое соединение конструкторам этих объектов, или объединение пулов соединений сделает для меня достаточно работы на этом фронте?
Комментарии:
1. Если вы используете так много контекстов, вы все равно неправильно используете EF. Обычно у вас должен быть один контекст для каждого запроса и общий доступ ко всей объектной модели для всего, что делает запрос.
2. Хотя я и не использую «по запросу», я использую только один
DbContext
для каждого запроса, и он должен открывать свое собственное или объединенное, или, если нет объединения, общее соединение. Это часто случается.
Ответ №1:
Это будет зависеть от системы базы данных, к которой вы обращаетесь, и от того, ADO.NET поставщик поддерживает объединение пулов соединений для этой конкретной системы баз данных.
Ответ на ваш вопрос: для SQL Server — нет, но для SQL Server Compact — да.
Комментарии:
1. Вы не можете утверждать, что ADO.NET не поддерживает объединение пулов соединений для SQL Server? Должно быть, я вас как-то неправильно понимаю.
2. Я отвечал на ваш вопрос, ответ уточнен / обновлен.
Ответ №2:
Если ваш провайдер поддерживает это, по моему опыту, объединение пулов соединений справляется с этим достаточно хорошо. Если вы считаете, что это узкое место, вам, конечно, следует провести тест.
Размышляя подобным образом, я однажды создал класс, подобный этому:
class Foo
{
SqlConnection con;
SqlCommand cmd1, cmd2;
void DoStuff();
static Foo GetFoo() { get from cache, or create a new one. }
}
Вместо того, чтобы создавать новый каждый запрос, я поддерживал соединения открытыми, а команды готовыми к действию, кэшируя весь Foo
объект. К сожалению, это лишь незначительно улучшило производительность SQL Server.
В вашем случае есть целый другой уровень Entity Framework, поэтому ваше общее улучшение будет еще менее значительным. В общем, я предполагаю, что если вы используете EF, вам в первую очередь не требуется высокая производительность, поэтому дополнительная сложность при таком небольшом выигрыше, вероятно, того не стоит.