Seite 1 von 1
Datenbankverbindung halten
Verfasst: 12. Oktober 2008 12:25
von tseucs
Hallo,
ich möchte gerne mit QSqlDatabase eine Datenbankverbindung aufbauen und dauerhaft halten. Leider verliere ich immer wieder den connect.
Ich habe schon versucht, mit isOpen() zu prüfen, ob die Verbindung noch steht und ggf. eine neue Verbindung aufzubauen, aber das funktioniert leider nicht.
Weiß hier jemand wie ich das hinbekommen kann?
Gruß
Torsten
Verfasst: 12. Oktober 2008 14:01
von solarix
Was meinst du mit "Leider verliere ich immer wieder den connect" und "das funktioniert leider nicht."? Code?
Verfasst: 13. Oktober 2008 08:41
von tseucs
Leider verliere ich immer wieder den connect heisst, dass nach einer Zeit die ich jetzt nicht weiss kein Datenbankaufruf mehr funktioniert. Die Datenbank-Aufrufe habe ich in folgender Klasse gekapselt:
class config {
public:
config();
...
QSqlQuery Query(QString query);
...
private:
...
QSqlDatabase db;
protected:
};
Und die Abfragen laufen hier:
QSqlQuery config::Query( QString query )
{
if (!db.isOpen()) {
db.open();
}
QSqlQuery qry(query);
return qry;
}
Am Anfang funktionieren alle Aufrufe, nach einiger Zeit gehen sie aber dann nicht mehr. Starte ich das Programm neu gehen sie wieder.
Verfasst: 13. Oktober 2008 08:50
von pfid
Was für eine Datenbank ist es? Schau mal in die Doku, es gibt ggfs. Connection Options für automatisches reconnect.
Verfasst: 13. Oktober 2008 09:02
von upsala
Ich glaub ja, daß dein Problem woanders liegt. (Bei MySQL liegt der Default-Timeout-Wert bei 8 Stunden...)
Verfasst: 13. Oktober 2008 09:46
von tseucs
Stimmt bestimmt alles - aber für mich wäre vor allem interessant, wie ich es mit Qt hinbekomme zu prüfen, ob die DB-Verbindung noch steht um sie dann ggf neu aufzubauen.
Verfasst: 13. Oktober 2008 11:39
von pfid
tseucs hat geschrieben:Stimmt bestimmt alles - aber für mich wäre vor allem interessant, wie ich es mit Qt hinbekomme zu prüfen, ob die DB-Verbindung noch steht um sie dann ggf neu aufzubauen.
Was für eine Datenbank hast du denn nun?
Prüfen & Wiederherstellen wird nicht so einfach gehn.
upsala hat geschrieben:Ich glaub ja, daß dein Problem woanders liegt. (Bei MySQL liegt der Default-Timeout-Wert bei 8 Stunden...)
Ist nur die Frage, ob der Defaultwert verwendet wird. Die MySQL Datenbank auf meinem Webshost ist nach 1-2 Minuten weg.
Verfasst: 13. Oktober 2008 11:42
von Undefined
Dein Problem ist das der Aufbau für eine Klasse die Thread Save ist falsch definiert wird. Du überschreibst beim zweiten Klassenaufruf deine Connection. Setze mal deine Debugger flags hoch und du wirst auch die entsprechenden Fehler Meldungen erhalten. Hinzu kommt das Qt eine eigenheit bei Threads mit sich bringt die nicht gerade Debugger freundlich ist. Dein Prozess nippelt ab und bekommst keine Meldung weil der Thread nicht mehr nachvollziehbar ist. (Das heist der schwirrt im Nirvana herum.)
Lese dir noch mal die Doku durch und Speziell das Thema addDatabase() und removeDatabse() dort wird dein Problem beschrieben.
Verfasst: 13. Oktober 2008 12:24
von upsala
Wer sagt, daß er einen Thread benutzt?
Um zu prüfen, ob eine Datenbankverbindung besteht muß eine Query abgesetzt werden. Und wenn die Query den Fehler bringt, daß die Verbindung weg ist, dann ist halt eine neue Verbindung aufzubauen. Also ist hinter jeder QSqlQuery die Abfrage einzubauen...
Verfasst: 13. Oktober 2008 12:53
von pfid
MySQL bietet dafür OPT_RECONNECT an, so dass die Verbindung automatisch wiederherstellt, wenn eine Query fehlschlägt, bzw. die Verbindung unterbrochen wurde (deswegen die Frage nach der Datenbank, die bisher noch nicht beantwortet werden konnte). Für die anderen Datenbankentypen weiß ich nicht, ob eine solche Option existiert, bei einigen erlaubt aber zumindest QSqlDatabase in den Connection Options das Timeout zu setzen.
Für die MySQL Einstellung siehe hier:
http://qtforum.de/forum/viewtopic.php?t=7185
bzw. hier:
http://qtforum.de/forum/viewtopic.php?t=7178
Verfasst: 13. Oktober 2008 13:33
von tseucs
Danke, Pfid. Das war tatsächlich die Lösung die ich Suche - auch wenn ich es nicht befriedigend finde, dass man dafür Qt neu kompilieren muss. Und das ich nicht gesagt habe welche DB es betrifft liegt daran, dass mich eine grundsätzliche Lösung interessiert hätte, also z.B. auch bei PostgreSQL und MSSQL - denn ein verlieren der Datenbankverbindung kann ja auch durch disconnect im Netzwerk passieren.
Verfasst: 13. Oktober 2008 19:08
von solarix
tseucs hat geschrieben:...auch wenn ich es nicht befriedigend finde, dass man dafür Qt neu kompilieren muss.
Glücklicherweise musst du nur den Treiber neu übersetzen.. nicht Qt
.. ausserdem bleibt das ja nicht ewig so:
http://trolltech.com/developer/task-tra ... &id=220810
tseucs hat geschrieben:
Und das ich nicht gesagt habe welche DB es betrifft liegt daran, dass mich eine grundsätzliche Lösung interessiert hätte, also z.B. auch bei PostgreSQL und MSSQL - denn ein verlieren der Datenbankverbindung kann ja auch durch disconnect im Netzwerk passieren.
Unterschiedliche Treiber(-Versionen) haben unterschiedliche Features, welche dann treiberspezifisch angesprochen werden müssen... manchmal kann daher die Software nicht komplett unabhängig des Treibers implementiert werden.. leider..