Question

Récemment, en entreprise, nous avons obtenu une base de données MSSQL issue d’un projet ancien que nous devons intégrer à la solution actuelle.

La base de données contient environ 100 à 150 procédures stockées qui utilisent la clause FOR XML AUTO, afin que les requêtes renvoient un graphe d'objet complet au format XML au lieu de lignes.

La solution la plus rapide (pour nous en entreprise) consistait à créer des classes sérialisables (avec xsd-tool) sur la base des données XML renvoyées de la base de données.

C'est le code que nous utilisons pour instater ces objets:

 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 représente la classe de base de données de la bibliothèque d'entreprise.

Lorsque sp retourne beaucoup de données (par exemple une grande collection d'objets avec beaucoup d'enfants, petits-enfants, objets grandgrndchldrn ...), l'exécution de cette méthode dure très longtemps.

Les données en cours d’application vont continuer à augmenter, et je dois penser à l’optimiser.

Je me demande donc s’il s’agit d’une mauvaise pratique (utilisation de FORXML, XmlReader et Deserialize) ou si nous devrions réécrire les procédures stockées et utiliser SqlDataReaders ou Linq2Sql, ou quelque chose de perfectionné se trouve dans cet extrait (utilisation incorrecte des génériques ou quelque chose d'autre)?

Modifier Je sais que le fait de charger une grande quantité de données à la fois est une mauvaise pratique et que le processus de chargement doit être scindé en plusieurs morceaux, mais je me demande simplement si quelque chose ne va pas avec ce code particulier.

Était-ce utile?

La solution

Vous devez analyser ce problème en termes de contenu dans le code XML renvoyé. Le XML renvoie-t-il des données qui n'ont pas besoin d'être en mémoire en même temps? Alors désérialiser le tout en mémoire n'est probablement pas la meilleure chose Si vous n’avez besoin que de traiter les données peu à la fois, vous devriez peut-être traiter le XML en tant que XML et conserver le XmlReader pour pouvoir le lire un à un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top