2013-08-06 5 views
0

Могу ли я хранить SqlConnection в HttpContext? Я имею в виду, как я могу поделиться одним SqlConnection через несколько классов?SqlConnection и HttpContext

В моем проекте каждый класс наследует базовый абстрактный класс, который открывает и закрывает соединение. Этот класс распознает, был ли открыт SqlConnection другим классом в этом случае.

Я могу сохранить это соединение по-другому, а не HttpContext? Существует еще один способ сделать это, exp. передать соединение между слоями?

THX

+8

Зачем вы хотите это сделать? Вы используете контекст транзакции? Почему вы не можете просто открывать и закрывать соединение, когда вам это нужно, и не делиться им? –

+0

Вы наверное * можете * - но на самом деле: зачем вам это нужно? Какую пользу вы ожидаете получить от хранения 'SqlConenction' в' HttpContext' ?? Я бы сказал, что вы всегда должны открывать свой 'SqlConnection' только тогда, когда это необходимо, используя' using (SqlConnection conn = новый SqlConnection (....)) {...} 'подход. –

ответ

0

Интересно, почему вам нужно хранить один SqlConnection. Это не пахнет здорово.

Если вы действительно сделать необходимость использовать одну SqlConnection по нескольким классам, инъекции зависимостей, вероятно, является лучшим вариантом. Создайте фабрику соединений, чтобы создать экземпляр объекта подключения и передать его по мере необходимости.

В противном случае позвольте СУБД беспокоиться о контроле ваших ресурсов соединения. Создавайте, открывайте и закрывайте соединение каждый раз, когда вам это нужно.

+0

OK, магазин связь не большой. Решение для вас - передать объект соединения между классами, не так ли? – user2336491

0

Вы идете неправильно. Вы не должны следовать этому мышлению, если вам не нужно использовать контекст транзакции, как упоминал Лассе В. Карлсен, упомянутый в его комментарии. Если вас беспокоит производительность, и это причина, по которой вы хотите, чтобы одно соединение открывалось и делилось, тогда это также неправильно.

В случае, например, У ADO.NET есть пул соединений. Это означает, что, хотя вы звоните близко к соединению, он не закрыт, он возвращается в пул . Это механизм, который отслеживает соединения и максимизирует эффективность, управляя ими. Если вы вызовете «Открыть», чтобы получить новое соединение, то под капотом вы можете получить существующий, который использовался несколько минут назад, и он все еще оставался открытым пулеметом и возвращался обратно для повторного использования.

Итак, если движущая сила является эффективностью, то это не путь, за которым следует следовать. На нем уже позаботились о более низком уровне. См. http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx.

+0

Я не очень хорошо объяснил. Я точно знаю, как работает Application Pool. Проблема не в этом. Я хотел бы использовать одно соединение для производительности. Если я держу соединение открытым, продолжительность разработки короче, то в другом случае (используйте соединение из каждого класса) – user2336491