Должен ли dapper использовать оператор using?
Я видел примеры, где кто-то делает:
IDbConnection db = new MySqlConnection(conn);
var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();
или вышеупомянутое - плохая практика, и все запросы должны быть помещены в операторы, подобные так:
using (var db = new MySqlConnection(conn))
{
var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();
}
4 ответа
Как правильно отметили другие, лучшая практика в целом заключается в использовании using
каждый раз, когда объект реализует IDisposable
и вы знаете, что время жизни объекта будет коротким, то есть не дольше, чем продолжительность текущего метода. Это гарантирует своевременную очистку дефицитных ресурсов операционной системы. Даже если утилизация объекта "поддерживается обратно" его финализатором, вы не хотите оказаться в ситуации, когда, скажем, у вас есть блокировка файла или базы данных или чего-то, что не будет освобождено, пока финализатор не выполнит несколько миллиард наносекунд с этого момента.
Однако я бы смягчил этот совет, сказав, что существует небольшое количество типов, которые реализуют IDisposable
по причинам, отличным от своевременного распоряжения неуправляемыми ресурсами. В некоторых особых случаях вы можете безопасно пропустить using
, Тем не менее, это почти никогда не неправильно использовать using
, даже если это не является строго обязательным условием, поэтому я советую вам ошибиться на стороне осторожности и чрезмерного использования, а не недоиспользования using
,
Дэппер не имеет представления об этом; кто ты есть using
здесь соединение с базой данных. Если вы завершили соединение: вы завершили соединение. В принципе, да, вы, вероятно, должны использовать using
,
Основное назначение использования статистики - высвобождение неуправляемых ресурсов. Когда объект больше не используется Сборщик мусора автоматически освобождает выделенную ему память, но иногда сборщик мусора не освобождает ресурсы, такие как файлы, потоки или соединение БД, как в вашем пример.
Подумайте об этом способе явно расположить объекты, а не оставлять его на усмотрение компилятора, чтобы вы могли сказать, что это лучшая практика.
По моему опыту работы с Sql Server и Oracle (используя драйверы ODP.Net и драйверы MS), вам нужно использовать обходные соединения, команды и транзакции, иначе вы скоро исчерпаете свой пул соединений, если будете делать что-то кроме простейшего взаимодействия с базой данных в производственная среда (пул соединений обычно ~50 - 200 соединений).
Вы можете не заметить поведение в среде разработки, потому что debug = много перезапусков, которые очищают пул.
Как сказал выше Эрик Липперт, в целом, рекомендуется использовать объекты вокруг IDisposable.
На практике вы можете пропустить "использование" в параметрах для SqlServer и Oracle.