Frage

Vor kurzem in Unternehmen haben wir eine MSSQL-Datenbank aus einem alten Projekt, das wir in der aktuellen Lösung zu integrieren haben.

Datenbank hat etwa 100-150 gespeicherte Prozeduren, die FOR XML AUTO-Klausel verwenden, so dass Abfragen vollständigen Objekt-Graph als XML zurückgeben statt Zeilen.

Schnellste Lösung (für uns in der Firma) war serializable Klassen zu erstellen (mit XSD-Tool), basierend auf den XML-Daten aus der Datenbank zurückgegeben.

Dies ist Code, den wir diese Objekte instatiate verwenden:

 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 stellt Datenbank-Klasse von Enterprise-Bibliothek.

Wenn sp gibt viele Daten (zum Beispiel einige große Sammlung von Objekten mit vielen Kindern, Enkeln, grandgrndchldrn ... Objekte in it) Ausführung dieses Verfahren dauert sehr lange.

Die Daten in der Anwendung wird surrely weiter wachsen, und ich muss daran denken zu optimieren.

Also, ich frage mich, ob diese schlechte Praxis (mit FORXML, XmlReader und Deserialize), oder wir sollten gespeicherte Prozeduren neu zu schreiben und SqlDataReaders oder Linq2Sql verwenden, oder es gibt einige perf.issue innerhalb dieses Schnipsel (unsachgemäße Verwendung von Generika oder etwas anderes)?


Bearbeiten Ich weiß, dass es eine schlechte Praxis ist auf einmal große ammount von Daten zu laden, und ich weiß, dass Ladeprozess auf kleinere Stücke aufgeteilt werden soll, aber ich frage mich nur, wenn etwas mit diesem Stück Code falsch ist.

War es hilfreich?

Lösung

Sie müssen dieses Problem im Hinblick auf die analysieren, was in die XML zurückgegeben wird. Wird die XML-Daten zurückgeben, die nicht alle auf einmal im Speicher sein muss? Dann alles in den Speicher Deserialisieren ist wahrscheinlich nicht die beste Sache. Wenn Sie nur die Daten, die ein wenig in einer Zeit verarbeiten müssen, dann sollten Sie vielleicht die XML als XML verarbeiten und die XmlReader halten um ein wenig in einer Zeit zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top