Вопрос

Недавно в компании мы получили базу данных MSSQL из какого-то старого проекта, которую нам нужно интегрировать в текущее решение.

База данных содержит около 100-150 хранимых процедур, которые используют предложение FOR XML AUTO, поэтому запросы возвращают полный объектный граф в виде XML вместо строк.

Самым быстрым решением (для нас в компании) было создание сериализуемых классов (с помощью xsd-инструмента) на основе данных XML, возвращаемых из базы данных.

Это код, который мы используем для создания этих объектов:

 public static T GetObjectFromXml<T>(DbCommand command)
    {
        SqlDatabase db = (SqlDatabase)DB;
        XmlReader xmlReader = null;
        T returnValue;

        xmlReader = db.ExecuteXmlReader(command);
        xmlReader.MoveToContent();

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        returnValue = (T)serializer.Deserialize(xmlReader);

        xmlReader.Close();

        return returnValue;


    }

DB представляет собой класс базы данных из корпоративной библиотеки.

Когда sp возвращает много данных (например, какую-то большую коллекцию объектов с множеством дочерних объектов, внуков, grandgrndchldrn... объектов), выполнение этого метода длится очень долго.

Объем данных в приложении, несомненно, будет продолжать расти, и мне нужно подумать об оптимизации этого процесса.

Итак, мне интересно, является ли это плохой практикой (использование FORXML, XmlReader и Deserialize), или нам следует переписать хранимые процедуры и использовать SqlDataReaders или Linq2Sql, или в этом фрагменте есть какая-то проблема perf.sue (неправильное использование дженериков или что-то еще). ) ?


РедактироватьЯ знаю, что загружать большой объем данных одновременно — плохая практика, и я знаю, что процесс загрузки следует разбивать на более мелкие фрагменты, но мне просто интересно, не случилось ли что-то не так с этим конкретным фрагментом кода.

Это было полезно?

Решение

Вам необходимо проанализировать эту проблему с точки зрения того, что в возвращаемый XML.Возвращает ли XML данные, которые не обязательно должны находиться в памяти сразу?Тогда десериализовать все это в память, наверное, не самое лучшее.Если вам нужно обрабатывать данные только понемногу, то, возможно, вам следует обрабатывать XML как XML и держать XmlReader под рукой, чтобы читать понемногу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top