最近,在公司我们从一些旧项目中获得了一些MSSQL数据库,我们必须将其集成到当前的解决方案中。

数据库有大约100-150个使用FOR XML AUTO子句的存储过程,因此查询将完整的对象图作为XML而不是行返回。

最快的解决方案(对我们公司而言)是基于从数据库返回的xml数据创建可序列化的类(使用xsd-tool)。

这是我们用来实例化这些对象的代码:

 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.issue(不当使用泛型或其他什么)?


修改 我知道一次加载大量数据是不好的做法,我知道加载过程应该分成更小的块,但我只是想知道这段特殊代码是否有问题。

有帮助吗?

解决方案

您需要根据返回的XML中的 来分析此问题。 XML是否一次性返回不需要在内存中的数据?然后将它全部反序列化到内存中可能不是最好的事情。如果您只需要一次处理一些数据,那么您应该将XML作为XML处理并保持XmlReader一次只读一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top