vorerst mal: ich bin ziemlich jungfräulich auf dem Gebiet Qt. Ich hoffe meine Frage(n) sind nicht allzu doof.
Ich habe ein Problem bei der Verwendung der Firebird Datenbank (die embedded-Version). Diese Datenbank lockt die gesamte Datenbankdatei exklusiv, sobald ein Prozess bzw. Thread darauf zugreift. Multi-User-Konzept und die Möglichkeit, mit mehreren Prozessen gleichzeitig auf die DB zuzugreifen, existieren bei der eingebetteten Variante nicht.
Also dachte ich mir: Damit andere Prozesse ebenfalls auf die DB zugreifen können, während meine Hauptapplikation läuft, stelle ich einfach immer nur kurz Verbindung zur DB her, um die benötigten Tabellen in Models zu laden, und schließe die Verbindung gleich wieder. So dürften andere Applikationen eigentlich NICHT melden, dass "sie nicht auf die DB zugreifen können, weil sie gerade von einem anderen Prozess verwendet wird". Dazu hab ich mir zwei Methoden geschrieben. Eine zum Öffnen der DB-Verbindung:
Code: Alles auswählen
void DbVerbindung::createDBConnection()
{
if ( sqlDatabase == 0 )
{
sqlDatabase = new QSqlDatabase( QSqlDatabase::addDatabase("QIBASE") );
sqlDatabase->setDatabaseName("C:\\DBS\\DATENTYPENTEST.FDB");
sqlDatabase->open();
}
}
und eine zum Schließen der Verbindung:
Code: Alles auswählen
void DbVerbindung::eraseDBConnection()
{
if ( sqlDatabase != 0 )
{
sqlDatabase->removeDatabase(sqlDatabase->connectionName());
sqlDatabase->close();
delete(sqlDatabase);
sqlDatabase = 0;
}
}
Die Methoden an sich funktionieren schon. Aber irgendwie wird die Datenbank trotzdem nicht freigegeben, so lange noch QSqlTabelModel-Instanzen existieren, die über die Datenbankverbindung gefüllt wurden. Zumindest melden andere Prozesse, dass die DB noch von meiner Hauptapplikation verwendet wird. Nur wenn ich die Models auch noch lösche mit delete() gibt meine Methode eraseDBConnection() die DB wirklich so frei, dass andere Prozesse darauf können. Aber die Models zu löschen ist ja eigentlich überhaupt nicht mein Wunsch. Im Gegenteil! Die sollen ja im Hauptspeicher erhalten bleiben, so lange bis ich die Änderungen über eine neue Verbindung wieder in die DB zurückschreibe.
Könnt ihr mir sagen, was ich da machen kann? (Btw: die Verwendung der Firebird Embedded Datenbank steht außer Frage. Das ist so fix im Rahmen meiner Diplomarbeit).
Vielen Dank für jegliche Form der Hilfe.
Viele Grüße, Philipp