2010-12-20 9 views
1

Ich verwende Qt, um eine Verbindung zu einer MySQL-Datenbank herzustellen (über QSqlTableModel/QSqlDatabase/etc), obwohl diese Frage allgemeiner ist.Abfrage der MySQL-Datenbank über Qt/QSqlTableModel (C++)

Was ist der beste Weg, um eine "Live-Aktualisierung der Datenbanktabelle" zu erhalten? Eine Option wäre, die gesamte Tabelle ständig abzufragen (wiederholtes Aufrufen der select() -Methode in QSqlTableModel). Dies scheint jedoch ineffizient (wird die gesamte Tabelle jedes Mal von MySQL zu Qt übergeben?)

Eine andere Option wäre, eine andere Tabelle, die als Protokolltabelle fungiert (verfolgt alle Updates/Änderungen) und dann Sie können diese Protokolltabelle abfragen (nur nach neuen Einträgen suchen ... was scheint effizienter zu sein?). Allerdings verlieren Sie dann eine Menge der eingebauten QSql-Funktionalität).

Oder sollte ich eine Zählervariable haben, die ich abfrage, und wenn das zunimmt, weiß ich, um die gesamte Tabelle zu aktualisieren?

All diese Ansätze scheinen ein bisschen chaotisch .. was würden Sie empfehlen? Vielen Dank.

Antwort

0

Das ist wirklich eine MySQL Frage, aber ich habe die Antwort! :)

Was Sie wollen, ist in der Tat, die Datenbank alle X Sekunden abzufragen. Was dies jedoch effizient macht, ist, wenn Sie einen MySQL-Trigger erstellen, so dass, wenn eine Zeile eingefügt, aktualisiert und/oder gelöscht wird, ein Indikator erzeugt wird.

Ich denke, Sie sollten einen Trigger erstellen, der die geänderte Zeile in eine zweite Tabelle einfügen wird. Die Umfrage von Ihrem Qt-Programm sollte diese Aktionen ausführen:

  • die zweiten „Modifikationen“ Tabelle sperren
  • den gesamten Inhalt der zweiten „Modifikationen“ Tabelle
  • alle Inhalte der zweiten „Modifikationen“ Tabelle löschen lesen
  • entsperren die zweite „Modifikationen“ Tabelle

Wenn Sie die Tabelle nicht sperren Sie versehentlich eine neue Zeile, die eingefügt wurde zwischen dem Lesen und löschen löschen könnten. Wenn Sie jedoch Sperren vermeiden möchten, lesen Sie einfach alles, und löschen Sie dann die Zeilen, die Sie abgerufen haben, basierend auf einer eindeutigen ID, die bei jeder Zeileneinfügung in der Tabelle "modifications" generiert wird.

Die FAQ und Dokumentation für MySQL auslöst, ist hier: http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html

Dokumentation zum Sperren/Entsperren Tabellen ist hier: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html