NHibernate Bulk einfügen oder aktualisieren

7

Hallo Ich arbeite ein Projekt, wo wir mehrere XML-Dateien einmal am Tag verarbeiten und eine Datenbank mit den Informationen in diesen Dateien füllen müssen.

Jede Datei hat ungefähr 1 MB und enthält ungefähr 1000 Datensätze; Normalerweise müssen wir zwischen 12 und 25 dieser Dateien verarbeiten. Ich habe einige Informationen zu Masseneinfügungen mit NHibernate gesehen, aber unser Problem ist etwas komplizierter, da die XML-Dateien neue Datensätze mit aktualisierten Datensätzen enthalten.

In der XML gibt es ein Flag, das uns sagt, dass ein bestimmter Datensatz ein neuer Datensatz oder ein Update für einen bestehenden Datensatz ist, aber nicht, welche Informationen sich geändert haben. Die XML-Datensätze enthalten nicht unseren DB-Bezeichner, aber wir können einen Bezeichner aus dem XML-Datensatz verwenden, um einen Datensatz in unserer Datenbank eindeutig zu lokalisieren.

Unsere bisherige Strategie bestand darin, zu ermitteln, ob es sich bei dem aktuellen Datensatz um eine Einfügung oder eine Aktualisierung handelt und wir entweder eine Einfügung in die Datenbank vornehmen oder eine Suche durchführen. Anschließend aktualisieren wir die Informationen zu dem Objekt mit den Informationen kommen aus dem XML-Datensatz und schließlich machen wir ein Update auf der DB.

Das Problem mit unserem derzeitigen Ansatz besteht darin, dass wir Probleme mit DB-Sperren haben und unsere Leistung sich sehr schnell verschlechtert. Wir haben über einige Alternativen nachgedacht wie getrennte Tabellen für die einzelnen Operationen oder sogar getrennte DBs, aber eine solche Bewegung zu machen würde eine große Anstrengung bedeuten, also bevor ich Entscheidungen für die Meinung der Community zu diesem Thema erbitte, danke im Voraus / p>     

Pedro Santos 18.02.2009, 10:53
quelle

2 Antworten

17

Ein paar Ideen:

  • Versuchen Sie immer, IStatelessSession für Massenoperationen zu verwenden.
  • Wenn Sie mit der Leistung immer noch nicht zufrieden sind, überspringen Sie einfach NHibernate und verwenden Sie eine gespeicherte Prozedur oder eine spezifische parametrisierte Abfrage oder verwenden Sie IQuery.ExecuteUpdate ()
  • Wenn Sie SQL Server verwenden, können Sie Ihr xml-Format in BCPFORMAT xml konvertieren und anschließend BULK INSERT (nur für Einfügungen)
  • ausführen
  • Wenn Sie zu viele DB-Sperren haben, versuchen Sie, die Operationen zu gruppieren (dh zuerst herausfinden, was eingefügt werden muss und was aktualisiert wird, dann PKs für die Aktualisierungen, dann BULK INSERT für Einfügungen und dann Aktualisierungen) / li>
  • Wenn das Parsing der Quelldateien ein Leistungsproblem darstellt (dh einen CPU-Kern ausschaltet), versuchen Sie es parallel (Sie könnten verwenden Parallele Erweiterungen )
Mauricio Scheffer 18.02.2009, 11:49
quelle
2

Dies könnte helfen: Ссылка

    
Harvey 30.03.2009 05:52
quelle

Tags und Links