Datenbankverbindung halten
Datenbankverbindung halten
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
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
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.
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.
Was für eine Datenbank hast du denn nun?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.
Prüfen & Wiederherstellen wird nicht so einfach gehn.
Ist nur die Frage, ob der Defaultwert verwendet wird. Die MySQL Datenbank auf meinem Webshost ist nach 1-2 Minuten weg.upsala hat geschrieben:Ich glaub ja, daß dein Problem woanders liegt. (Bei MySQL liegt der Default-Timeout-Wert bei 8 Stunden...)
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.
Lese dir noch mal die Doku durch und Speziell das Thema addDatabase() und removeDatabse() dort wird dein Problem beschrieben.
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
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
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.
Glücklicherweise musst du nur den Treiber neu übersetzen.. nicht Qttseucs hat geschrieben:...auch wenn ich es nicht befriedigend finde, dass man dafür Qt neu kompilieren muss.
.. ausserdem bleibt das ja nicht ewig so: http://trolltech.com/developer/task-tra ... &id=220810
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..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.