По материалам статьи Jonathan Goodyear: Use
DataReader or DataSet? Перевод Максима Зубова
Я постоянно слышу один и тот же вопрос: "Что мне лучше
использовать для моего ASP.NET веб - приложения, DataReader
или DataSet?". Самое большое недоразумение, которое я
когда-либо читал в статьях или новостных группах, состоит в
том, что DataReader (имеется в виду SqlDataReader или
OleDbDataReader) лучше, чем DataSet. Иногда я встречаю
абсолютно противоположное утверждение. Суть в том, что
Microsoft разработал оба этих класса для доступа к данным
только потому, что оба они нужны. У каждого есть свои сильные
и слабые стороны, и использование какого-либо одного из них
должно определяться конкретной ситуацией. Статья проливает
свет на эту проблему, приводя несколько принципов, на
основании которых можно сделать выбор, когда использовать
DataReader, а когда DataSet в контексте разработки ASP.NET.
При разработке клиентских Windows Forms приложений, эти
правила могут быть изменены. Я предполагаю здесь, что вы
достаточно знакомы с обоими этими классами.
Использование класса DataReader
Вот идеальные ситуации в которых вам следует использовать
класс DataReader:
- Данные, которые Вы запрашиваете должны всегда быть
актуальными, и поэтому должны запрашиваться из БД каждый
раз, как только Вам это необходимо. Класс DataReader
создается быстрее, и производительность класса DataReader
увеличивается быстрее по сравнению с классом DataSet при
увеличивающейся загрузке (см. статьи Visual Studio Magazine
в разделе Resources).
- Вам просто нужна каждая строка данных. Наилучшим
примером в этом случае может служить простое связывание
класса DataReader с элементом управления веб, таким как
DataGrid или DropDownList.
- Вам нужно простое чтение XML данных из БД, только
вперед. В этом случае вы можете использовать метод
ExecuteXmlReader() объекта SQLCommand для доступа к классу
XmlReader (XML аналог DataReader). Для этого необходимо
использовать предложение FOR XML в запросе к SQL Server, или
поле типа ntext, которое содержит корректный XML.
- Вы планируете использовать несколько повторяющихся
запросов для получения информации частями. Особенность,
которая описана в первой ситуации, еще больше проявляется
здесь.
- Действительно, многие возможности, которые делают класс
DataSet лучше, такие, как возможность устанавливать связи
между таблицами, лучше оставить для клиентских Windows Forms
приложений.
Использование класса DataSet
Вот когда вам следует рассмотреть возможность использования
класса DataSet:
- Вы создаете веб сервис, который использует данные,
которые вы получаете как результат запроса. Из-за того, что
класс DataReader осуществляет соединение с БД, они не могут
быть преобразованы в XML и, следовательно, не могут быть
переданы вызывающей стороне через веб - сервис.
- Вам нужно использовать сортировку или фильтрацию данных.
Прежде чем использовать объект DataView (со свойством
DefaultView класса DataTable, содержащий класс DataSet) для
сортировки и фильтрации данных, попробуйте сначала
использовать специальные конструкции SQL запроса - такие как
WHERE и ORDER BY - чтобы сохранить возможность использования
более легкого и быстрого класса DataReader. Однако когда
этим не обойдешься, или когда вам нужно использовать
сортировку или фильтрацию данных несколько раз, то, конечно,
следует использовать DataSet.
- Вам необходимо перемещаться по данным, полученным в
результате одного запроса несколько раз. Перемещаться по
набору данных DataReader можно только один раз. Если, для
примера, вам нужно связывать более одного серверного
элемента управления с одними и теми же данными, то
использование класса DataSet более предпочтительно.
DataReader не может быть привязан к более чем одному
серверному элементу управления, потому что он умеет
перемещаться по своим данным только вперед. Вам придется
запрашивать данные из БД второй раз, для того чтобы
использовать DataReader в этом случае.
- Вам нужно хранить данные, которые будут использоваться
для последующих запросов страниц. Если данные принадлежат
кому-то, кто их запросил, вы можете сохранить класс DataSet
в переменной Session. Если к этим данным могут иметь доступ
все, то вы можете сохранить их в переменной Application или
в Cache (рекомендуется по причине того, что поддерживаются
сроки хранения и обратные вызовы). По причине того, что
класс DataReader поддерживает открытое соединение с БД, и
хранит только одну строку данных в единицу времени, он не
может использоваться в запросах различных страниц.
- Вам приходится использовать сложные или требующие много
времени функции для каждого элемента результирующего набора
данных. Например, если вы получили список почтовых индексов
и теперь хотите вызвать веб сервис для получения детальной
информации по каждому индексу, лучше всего использовать
DataSet. Все потому, что при использовании класса
DataReader, соединение с БД не будет освобождено до тех пор,
пока вы не уничтожите сам DataReader. Даже небольшая
задержка на одной странице, при обработке тысяч таких
страниц может повлечь за собой значительное увеличение
трафика через доступные соединения. В отличие от этого,
DataSet может получить сразу все данные и закрыть соединение
с БД.
- Вам требуется загрузить и обработать XML данные по
двумерному принципу. Использование класса DataSet более
предпочтительно для обработки XML, потому что вы можете
использовать DataView для сортировки и фильтрации полученных
данных таким же способом, как и при работе с обычным набором
данных. Заметьте, однако, что в пространстве имен System.Xml
реализовано множество классов, специально разработанных для
обработки XML данных.
- Вы работаете с источником данных, не относящимся к БД.
Несмотря на то, что OleDbDataReader может использоваться для
любого OLEDB провайдера (который может представлять или не
представлять БД), объект DataSet может загружать данные
напрямую из XML файлов и динамически интерпретировать их
схему. DataSet также обладает возможностью записывать XML
данные в поток или в файл.
Как вы можете видеть, класс DataSet имеет больше
возможностей, чем DataReader, которые позволяют вам
использовать DataSet гораздо шире. Это, однако, не означает
то, что DataSet используется чаще. Многие задачи, которые вы
решаете в своих ASP.NET приложениях вполне под силу
DataReader. И все-таки, класс DataSet несомненно играет
очень важную роль в ASP.NET веб - приложениях. Вы можете
уменьшить проблему потребности в ресурсах класса DataSet
разумным использованием механизмов кэширования. Оба
рассмотренных класса являются необходимыми составными частями
успешного ASP.NET веб - приложения. Очень важно понимать и
знать, когда лучше использовать один из них.
Resources
[В начало]
|