Пожалуйста, дайте совет, если можете ...
Мой проект основан на Linq-To-SQL, и (почти) законченное приложение имеет очень низкую производительность. Я много раз запускал SQL Profiler, чтобы оптимизировать запросы с помощью LoadOptions, чтобы уменьшить количество обращений к серверу базы данных, но в конце дня моя головоломка разбита на следующие моменты:
Официальный совет Microsoft заключается в том, что DataContext должен не иметь длительный срок службы - то есть - они советуют вам создавать DataContext, материализовывать объекты, вносить изменения, вызывать метод SubmitChanges (), тогда утилизируйте. Мое заявление неукоснительно следует этому образцу.
DataContext имеет тенденцию быть очень цепким к своим сущностям, и отсоединение и повторное присоединение (неизмененных) объектов из одного контекста к другому оказалось проблематичным, когда дело доходит до отслеживания изменений и загрузки отложенных отношений повторно прикрепленные объекты. Таким образом, хранение загруженного кеша объектов оказалось проблематичным.
Когда для DataContext установлены LoadOptions для загрузки нескольких слоев отношений, производительность снижается, поскольку результирующие данные являются произведением связанных строк, а не их суммой. Конкретная схема, из которой я извлекаю данные, буквально вызывает 144-кратное увеличение объема данных, возвращаемых при установке LoadOptions, поэтому, естественно, это приводит к снижению производительности, а не к помощнику.
Без установки LoadOptions (или даже при установке его на пониженном уровне) DataContext выполняет сотни обращений к базе данных.
Я также заметил, что DataContext игнорирует, что объект уже загружен в первый раз, когда объект посещается через отношение ... например:
Dim allCustomers as Customers() = Context.Customers.ToArray()
Dim allOrders as Orders() = Context.Orders.ToArray()
For Each o as Order in allOrders
Console.WriteLine(o.Customer.Name) ' <- Triggers round-trips to database!!!
Next
Таким образом, у меня проблема в том, что производительность, которую я получаю, неприемлема для моего клиента, и:
- Хранение единственного DataContext для всего приложения не рекомендуется.
- Кэширование и повторное присоединение сущностей (на первый взгляд) проблематично.
- С глубокими многоуровневыми отношениями DataContext.LoadOptions снижает производительность
- Предварительная загрузка данных всей таблицы не помогает - DataContext по-прежнему обновляет загруженный объект при посещении отношения внешнего ключа.
Я действительно чувствую, что здесь упустил что-то фундаментальное, возможно, в общем шаблоне проектирования, который я принял, и буду признателен за любые советы, которые вы можете получить, чтобы получить загруженный объектный граф из DataContext без всего обходы или раздутый сетевой трафик.
Ваш совет?