Frage

Wir haben eine Anwendung, die Echtzeitdaten und fügt sie in die Datenbank übernimmt. es ist gerade online für 4,5 Stunden am Tag. Wir Einsatzdaten von Sekunde zu Sekunde in 17 Tabellen. Der Benutzer jederzeit jede Tabelle für die neuesten zweiten Daten und einigen Rekord in der Geschichte ...

abfragen kann,

Umgang mit dem Zuführ- und Einfügen erfolgt über eine C # Konsolenanwendung mit ...

Benutzeranforderungen Handhabung wird durch einen WCF-Dienst gemacht ...

Wir haben herausgefunden, dass die Insertion unser Engpass ist; die meiste Zeit wird genommen. Wir investierten die Tabellen und indecies viel Zeit zu finetune versuchen, noch die Ergebnisse nicht zufriedenstellend waren

Unter der Annahme, dass wir suffecient Gedächtnis haben, was ist die beste Praxis Daten in den Speicher zu legen, anstatt Datenbank zu haben. Derzeit verwenden wir Datentabellen, die aktualisiert werden und jede Sekunde eingefügt Ein Kollege von uns vorgeschlagen, einem anderen WCF-Dienst statt Datenbank zwischen den Feed-Handler und den WCF-Benutzer-Anfragen-Handler. Die WCF Mittelschicht sollte sein TCP-basierte und hält die Daten in seinem eigenen Speicher. Man kann sagen, dass die Feed-Handler mit Benutzer-Anfragen umgehen könnten stattdessen eine mittlere Schicht zwischen zwei Prozessen zu haben, aber wir wollen separate Dinge so, wenn die Feed-Handler-Abstürze wollen wir noch in der Lage sein den Benutzer mit den aktuellen Datensätze zur Verfügung zu stellen

Wir sind zeitlich begrenzt, und wir wollen, dass alles in den Speicher in kurzer Zeit bewegen. Ist mit einer schlechten Sache zu tun, um eine WCF in der Mitte von zwei Prozessen? Ich weiß, dass die Anfragen einigen Aufwand hinzufügen, aber alle diese drei Verfahren (Feed-Handler, In-Memory-Datenbank (WCF), Benutzer-Anfrage-Handler (WCF) auf der gleichen Maschine sein werden und die Bandbreite wird nicht so viel sein ein Problem.

Bitte helfen!

War es hilfreich?

Lösung

Ich würde schauen in einen Cache der Daten zu erstellen (so dass Sie auch Datenbank wählen reduzieren können), und invalidate Daten im Cache, sobald es in die Datenbank geschrieben wurde. Auf diese Weise können Sie Batch-up Anrufe einen größeren Einsatz anstelle von vielen kleineren zu tun, halten aber die Daten im Speicher, so dass die Leser es lesen können. Eigentlich, wenn Sie wissen, wann die Daten abgestanden geht, können Sie vermeiden, dass die Datenbank vollständig zu lesen und verwenden Sie es nur als Hintergrundspeicher -. Diese Weise die Leistung der Datenbank wird nur beeinflussen, wie groß Ihr Cache bekommt

Invalidierung Daten im Cache wird entweder basieren auf, ob seine in die Datenbank geschrieben oder seine gegangen abgestanden, die immer kommt letzte , nicht zuerst.

Die Cache-Schicht nicht kompliziert sein muß, aber es sollte die Daten an Host-Multi-Threaded und auch speichern sie im Hintergrund. Diese Schicht würde direkt hinter dem WCF-Dienst, das Verbindungsmedium sitzt, und der WCF-Dienst verbessert werden soll die Logik der Konsole app + die Dosier- Idee zu enthalten. Dann kann die Konsole app nur WCF verbinden und an ihm werfen Ergebnisse.

Update: die einzige andere Sache zu sagen, ist in einem Profiler investieren, um zu sehen, wenn Sie irgendwelche Performance-Probleme im Code einzuführen, die maskiert werden. Auch das Profil Ihrer Datenbank. Sie erwähnen Sie schnell Einsätze und wählen müssen - leider, sie in der Regel Abwägen gegeneinander ...

Andere Tipps

Welche Art von Datenbank verwenden Sie? MySQL verfügt über eine Speicher-Speicher-Engine, die auf diese Art von Dingen geeignet scheinen, zu sein.

Sind Sie mit Datentabelle mit Dataadapter? Wenn ja, würde ich empfehlen, dass Sie sie komplett über Bord werfen. Legen Sie Ihre Aufzeichnungen direkt mit DBCommand. Wenn Benutzer Berichte anfordern, lesen Daten Datareader, oder füllen Datatable-Objekte DataTable.Load (IDataReader) verwendet wird.

Storying Daten im Speicher hat das Risiko von Daten bei Abstürzen oder Stromausfälle zu verlieren.

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