Я инкапсулирую свои linq в вызовы sql в классе репозитория, который создается в конструкторе моего перегруженного контроллера. Конструктор моего класса репозитория создает контекст данных, так что для жизни загрузки страницы используется только один контекст данных.Почему мои соединения не закрыты, даже если я явно удаляю DataContext?
В моем деструкторе класса репозитория я явно вызываю утилиту DataContext, хотя я не считаю, что это необходимо.
Использование монитора производительности, если я наблюдаю, как мои соединения с пользователем подсчитываются и многократно загружают страницу, число увеличивается один раз на загрузку страницы. Соединения не закрываются или не используются (около 20 минут).
Я попытался положить Pooling = false в мою конфигурацию, чтобы убедиться, что это не повлияло, но это не так. В любом случае с пулом я бы не ожидал нового подключения для каждой нагрузки, я бы ожидал, что он будет повторно использовать соединения.
Я попытался поставить точку останова в деструкторе, чтобы убедиться, что у вас есть цель, и это действительно так. Так что происходит?
Часть кода, чтобы проиллюстрировать то, что я сказал выше:
Контроллер:
public class MyController : Controller
{
protected MyRepository rep;
public MyController()
{
rep = new MyRepository();
}
}
Репозиторий:
public class MyRepository
{
protected MyDataContext dc;
public MyRepository()
{
dc = getDC();
}
~MyRepository()
{
if (dc != null)
{
//if (dc.Connection.State != System.Data.ConnectionState.Closed)
//{
// dc.Connection.Close();
//}
dc.Dispose();
}
}
// etc
}
Примечание: добавить несколько подсказок и контекстной информации в DC для целей аудита. Это, по существу, почему я хочу одно соединение на странице загрузки
Update: После реализовав IDisposable на моем хранилище и на моем классе контроллера я не мог найти способ специально вызвать метод Dispose на мой контроллер, что и контроллер создается и уничтожается за кулисами MvcHandler. Однако я обнаружил, что мои связи все равно закрываются. Я не комфортно, зная, что это работает, но не зная, почему, так что я сделал некоторые раскопки и нашел цитату MSDN, которая сделала меня счастливым:
Когда исполнение завершено, MvcHandler будет проверять, если контроллер реализует IDisposable интерфейс, и если это так, вызывается Dispose на контроллере для очистки неуправляемых ресурсов.
Final Update: Через месяц или около того с работой этого я теперь удалены весь этот код и пошел вниз MS посоветовал маршрут оборачивать «используя» заявление вокруг кода в моих методах общественного хранилища и передача этого DC в частные методы. Это кажется немного расточительным и повторяющимся, а также приводит к открытию и закрытию еще нескольких соединений. Но я получал linq для кэширования sql, что я мог решить только путем сброса DC.
ах, спасибо. Мне просто интересно, нужен ли мой код для добавления (ссылаясь на редактирование) –
Я не уверен в последнем бит. MVC генерирует мой контроллер, и как я могу обеспечить его правильное расположение? –
@ Крис, будьте осторожны при наследовании, я замечаю, что вы защитили поля. Я бы этого не сделал. –