использования ORM сломано немало копий. Доклад будет посвящен нашим подходам к работе с данными. Вы узнаете, какие возможности работы с множеством данных предоставляют различные провайдеры ADO.NET, зачем вам Batch- и Bulk-операции, как шутя обрабатывать десятки и сотни миллионов записей, что такое гибридные DAL и зачем мы используем три ORM в одном продукте. 2
→ однонаправленная зависимость Соблюдается SOLID Лучше подходит для нетривиальных соответствий (например, объекты с коллекциями) Не решает задачу массовых CRUD-операций 7
в том числе интеграций и пользовательских интерфейсов UI Открытые данные https://apidata.mos.ru/ Интеграция с 1С и SAP Если нужен IQueryable, то описания сущностей, DML и Queryable будут (широким) контрактом DAL и (или) бизнес-логики. Даже в этом случае маппинги, преобразования – в отдельной сборке. Следует контролировать зависимости (их отсутствие) от сборок ORM Другой подход: репозитории с тематическими методами (например, GetByOriginSupply) 12
(SoC) Более «чистый» код бизнес-логики Разделение разработчиков по компетенциям Data-centric приложение (ETL и др.) Интероперабельность, замена реализации DAL Лишний слой абстракции добавляет сложности Нельзя не думать о том, какие запросы породит бизнес-логика
узкий контракт для бизнес-логики приложения Муторно, но несложно Код бизнес-логики читается реально легко Далеко не все возможные поисковые методы будут нужны Но если потребитель приложения сам строит запрос (например, OData), прокинуть IQueryable насквозь – здравое решение 20
«DAL-религии» Архитектор продукта решает В последних продуктах преобладают собственные репозитории поверх ORM с «тематическими» методами и иногда с IQueryable В текущем продукте используем несколько ORM (NHibernate, Dapper), а еще один достался в наследство Code-First 22
IDbConnection IDbCommand IDataReader Хранение в памяти и обработка* (Db)DataAdapter DataSet * Работа с этими классами скорее характерна для Table Module, Transaction Script и DAL 24
Но сохранять поштучно?! Ответ: int DbDataAdapter.UpdateBatchSize Batch [bæʧ] – 1) группа; серия; партия; пакет 2) формировать, накапливать Пакетная обработка повышает производительность за счет уменьшения roundtrip Поддерживается, если автор провайдера пожелает UpdateBatchSize должен быть разумного размера. Большое значение снижает производительность. А если не использовать DbDataAdapter? 25
– множество запросов Через точку с запятой DML оборачивается в вызовы sp_executesql int Oracle.DataAccess.Client.OracleCommand.ArrayBindCount Array Binding – один текст команды, параметры – массивы. СУБД организует цикл на своей стороне Производительность Row-by-row и Batch может отличаться на два порядка 26
Особенности СУБД существенно различаются Как следствие в ADO.NET не стандартизовано, но выглядит похоже во многих провайдерах Bulk [bʌlk] – большое количество, большой массив данных, груда, масса Утилиты, в SQL Server – bcp, в Oracle Database – SQL*Loader 27
к данным? Покрывает ли ORM все потребности в DAL? Почему разработчики .NET оказались в привилегированном положении? Что DAL может предоставить для миграции баз данных? 30