Pergunta

Recentemente, em companhia temos algum banco de dados MSSQL de algum projeto antigo que temos de integrar na solução atual.

Banco de Dados tem cerca de 100-150 procedimentos armazenados que o uso cláusula FOR XML AUTO, para que consultas retornam completa objeto gráfico como XML em vez de linhas.

solução mais rápida (para nós na companhia) era criar classes serializáveis ??(com xsd-ferramenta) com base nos dados XML retornados do banco de dados.

Este é o código que usamos para instatiate esses objetos:

 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 representa classe de banco de dados da biblioteca da empresa.

Quando sp retorna muitos dados (por exemplo algum grande coleção de objetos com muitos filhos, netos, grandgrndchldrn ... objetos nele) execução deste método dura muito tempo.

Os dados da aplicação irá surrely continuar a crescer, e eu devo pensar em otimizar isso.

Então, eu estou querendo saber se esta é uma prática ruim (usando FORXML, XmlReader e Deserialize), ou devemos reescrever procedimentos e uso SqlDataReaders ou Linq2Sql armazenado, ou existe algum perf.issue dentro deste trecho (uso indevido de medicamentos genéricos ou qualquer outra coisa)?


Editar Eu sei que é má prática para carregar grande ammount de dados de uma vez, e eu sei que o processo de carga deve ser parceladas em pedaços menores, mas eu só estou querendo saber se algo está errado com este pedaço de código específico.

Foi útil?

Solução

Você precisa analisar este problema em termos do que é em do XML que estão sendo devolvidos. É o XML retornando dados que não precisam estar na memória de uma só vez? Então deserializing tudo na memória provavelmente não é a melhor coisa. Se você só precisa para processar os dados um pouco de cada vez, então talvez você deve processar o XML como XML e manter o XmlReader ao redor para ler um pouco de cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top