Datenbankverbindung halten

Alles rund um die Programmierung mit Qt
Antworten
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Datenbankverbindung halten

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Was meinst du mit "Leider verliere ich immer wieder den connect" und "das funktioniert leider nicht."? Code?
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag 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.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Was für eine Datenbank ist es? Schau mal in die Doku, es gibt ggfs. Connection Options für automatisches reconnect.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich glaub ja, daß dein Problem woanders liegt. (Bei MySQL liegt der Default-Timeout-Wert bei 8 Stunden...)
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag 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.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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.
Undefined
Beiträge: 34
Registriert: 19. Oktober 2006 17:12

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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 :wink:
.. 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..
Antworten