Synchronisieren der SQLite-Datenbank vom Speicher zur Datei

8

Ich schreibe eine Anwendung, die Informationen ziemlich häufig protokollieren muss, sagen wir, zweimal in einer Sekunde. Ich möchte die Informationen in einer SQLite-Datenbank speichern, aber es macht mir nichts aus, Änderungen alle zehn Minuten auf den Datenträger zu übertragen.

Das Ausführen meiner Abfragen bei Verwendung einer Datei-Datenbank dauert zu lange und lässt den Computer nacheilen.

Eine optionale Lösung besteht darin, eine In-Memory-Datenbank zu verwenden (sie passt, keine Sorge) und synchronisiert sie von Zeit zu Zeit auf die Festplatte,

Ist es möglich? Gibt es einen besseren Weg, dies zu erreichen (können Sie sqlite sagen, dass es erst nach X Abfragen auf den Datenträger übertragen wird?).

Kann ich das mit Qt 's SQL wrapper lösen?

    
Elazar Leibovich 22.06.2010, 15:37
quelle

3 Antworten

11

Nehmen wir an, Sie haben eine Datenbank namens 'disk_logs' mit einer Tabelle namens 'events'. Sie können Ihrer vorhandenen Datenbank eine In-Memory-Datenbank hinzufügen:

%Vor%

Erstellen Sie eine Tabelle in dieser Datenbank (die sich vollständig im Speicher befinden würde), um die eingehenden Protokollereignisse zu empfangen:

%Vor%

Übertragen Sie dann die Daten während der Anwendungsausfallzeit aus der In-Memory-Tabelle in die On-Disk-Tabelle:

%Vor%

Und löschen Sie dann den Inhalt der vorhandenen In-Memory-Tabelle. Wiederholen.

Dies ist jedoch ziemlich kompliziert ... Wenn Ihre Datensätze mehrere Tabellen umfassen und mit Fremdschlüsseln verknüpft sind, kann es bei der Übertragung von In-Memory-Tabellen auf On-Disk-Tabellen ein Problem sein, diese synchron zu halten.

Bevor Sie etwas ( unangenehm überentwickelt ) so versuchen, würde ich auch vorschlagen versuche SQLite so schnell wie möglich zu machen . SQLite sollte leicht handle & gt; 50K Rekordeinsätze pro Sekunde. Einige Protokolleinträge zweimal pro Sekunde sollten keine signifikante Verlangsamung verursachen.

    
Mike Willekes 28.06.2010, 14:46
quelle
5

Wenn Sie jede Einfügung innerhalb einer eigenen Transaktion ausführen, kann dies einen erheblichen Beitrag zu den verlangten Verzögerungen leisten. Vielleicht könnten Sie:

  • Zählen Sie die Anzahl der bisher eingefügten Datensätze
  • Beginnen Sie eine Transaktion
  • Fügen Sie Ihren Datensatz
  • ein
  • Anzahl erhöhen
  • Commit / Transaktion beenden, wenn N Datensätze eingefügt wurden
  • Wiederholen Sie

Der Nachteil ist, dass Sie, wenn das System in diesem Zeitraum abstürzt, riskieren, die nicht festgeschriebenen Datensätze zu verlieren (aber wenn Sie eine In-Memory-Datenbank verwenden wollten, dann klingt es nach dem Risiko) / p>     

Mike Willekes 28.06.2010 14:56
quelle
2

Eine kurze Suche in der SQLite-Dokumentation ergab nichts Nützliches (es war nicht wahrscheinlich und ich habe es nicht erwartet).

Warum nicht einen Hintergrund-Thread verwenden, der alle 10 Minuten aufwacht, alle Protokollzeilen aus der In-Memory-Datenbank in die externe Datenbank kopiert (und sie aus der In-Memory-Datenbank löscht). Wenn Ihr Programm zum Beenden bereit ist, aktivieren Sie den Hintergrund-Thread ein letztes Mal, um die letzten Protokolle zu speichern, und schließen Sie dann alle Verbindungen.

    
Craig Trader 22.06.2010 15:48
quelle

Tags und Links