Domanda

Di recente, in azienda abbiamo ottenuto alcuni database MSSQL da alcuni vecchi progetti che dobbiamo integrare nella soluzione attuale.

Il database ha circa 100-150 stored procedure che utilizzano la clausola FOR XML AUTO, in modo che le query restituiscano un grafico a oggetti completo come XML anziché righe.

La soluzione più rapida (per noi in azienda) era creare classi serializzabili (con xsd-tool) basate sui dati xml restituiti dal database.

Questo è il codice che usiamo per istanziare quegli oggetti:

 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 rappresenta la classe Database dalla libreria aziendale.

Quando sp restituisce molti dati (ad esempio una grande raccolta di oggetti con molti figli, nipoti, grandgrndchldrn ... oggetti in esso), l'esecuzione di questo metodo dura molto a lungo.

I dati nell'applicazione continueranno a crescere, e devo pensare a ottimizzarli.

Quindi, mi chiedo se questa è una cattiva pratica (usando FORXML, XmlReader e Deserialize), o dovremmo riscrivere le procedure memorizzate e usare SqlDataReaders o Linq2Sql, o se c'è qualche perf.issue all'interno di questo snippet (uso improprio di generici o qualcos'altro)?


Modifica So che è una cattiva pratica caricare una grande quantità di dati contemporaneamente, e so che il processo di caricamento dovrebbe essere suddiviso in blocchi più piccoli, ma mi chiedo solo se c'è qualcosa di sbagliato in questo particolare pezzo di codice.

È stato utile?

Soluzione

Devi analizzare questo problema in termini di cosa è in l'XML restituito. L'XML restituisce i dati che non devono essere memorizzati tutti in una volta? Quindi deserializzare tutto in memoria probabilmente non è la cosa migliore. Se devi solo elaborare i dati un po 'alla volta, allora dovresti forse elaborare l'XML come XML e tenere l'XmlReader in giro per leggere un po' alla volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top