![]() |
Datenbank: SQLite • Version: 3.xx • Zugriff über: Firedac
Zugriff auf Datenbank serialisieren
Ich nutze SQLite mit FMX auf Mobilen geräten.
Um die Oberfläche responsive zu halten muss ich oft Vorgänge in WorkerThreads auslagern. Ich lagere diese Arbeit in Anonyme threads aus und Zeige in der App einen Sperrbildschirm mit Aktivitäts-Anzeige(Kreisel) oder Fortschritsbalken oder Aktivitäts-Log an. Sprich es passiert trotzdem alles sequentiel, aber die Oberfläche meldet nicht nach so Dinge wie "Anwendung reagiert nicht mehr, wollen Sie sie beenden?", wenn man auf den Sperrbildschirm tippt oder wischt und 500ms lang nicht drauf reagiert. Die Programm logik stellt seit kurzem nicht mehr sicher das sequentiel auf die DB zugegriffen wird. Bevor ich diesen Teil der Logik jetzt Nachliefere habe ich mal folgende Einstellungen ausprobiert.
Delphi-Quellcode:
Ich habe die Zeilen Hier 1 bis Hier 6 angepasst oder hinzuefügt.
FDManager.Active := true;//Hier 6
FConnection := TFDConnection.Create(self); PhysSQLiteDriverLink := TFDPhysSQLiteDriverLink.Create(self); GUIxWaitCursor := TFDGUIxWaitCursor.Create(self); GUIxAsyncExecuteDialog := TFDGUIxAsyncExecuteDialog.Create(Application.MainForm); FConnection.Params.Values['DriverID'] := 'SQLite'; {$IFDEF ANDROID} FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetHomePath, 'APP.s3db'); {$ELSE} {$IFDEF IOS} FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'APP.s3db'); {$ELSE} FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetHomePath, 'APP.s3db'); {$ENDIF} {$ENDIF} FConnection.Params.Values['Lockingmode'] := 'Normal'; //Hier 1 FConnection.Params.Values['Synchronous'] := 'Full'; //Hier 2 FConnection.Params.Values['SharedCache'] := 'False'; //Hier 3 FConnection.UpdateOptions.LockWait := true; //Hier 4 FConnection.UpdateOptions.LockMode := TFDLockMode.lmPessimistic;//Hier 5 FConnection.Params.Values['DateTimeFormat'] := 'String'; {$IFDEF IOSSIM} FConnection.Params.Values['Password'] := ''; // im Apple SIM geht das nicht mit Password {$ELSE} FConnection.Params.Values['Password'] := 'MyPass'; // Ohne Passwort fragt er nach einem Passwort! Auch wenn es leer ist. {$ENDIF} PhysSQLiteDriverLink.DriverID := 'SQLite'; GUIxWaitCursor.Provider := 'FMX'; GUIxAsyncExecuteDialog.Provider := 'FMX'; Jetzt bekomme ich keine Fehler mehr wenn ein Query mit locate auf die DB zugreift und sich in einem anderen Thread befindet. Sorgen diese Einstellungen bereits das Zugriffe aus mehreren Threads sequentiel abgearbeite werden. Oder muss ich wirklich selber alle SQLITE DB Zugriffe verriegeln? (Leider beherrscht SQLite nur eine einzige gleichzeitige Connection) |
AW: Zugriff auf Datenbank serialisieren
Ich nehme an das hier ist der falsche Ort?
|
AW: Zugriff auf Datenbank serialisieren
Ist doch richtig hier, warum nicht ?
![]() Ich habe das jetzt nicht festgestelt, mache aber nur wenig Komplexes mit Sqlite. Auszug ![]() Zitat:
|
AW: Zugriff auf Datenbank serialisieren
Zitat:
Seit ich die Einstellungen von FireDac und SQLite wie oben angegeben geändert habe scheint es so zu sein, dass keine Fehler mehr auftauchen und zumidest lese Zugriffe und locates aus zwei threads verarbeitet werden. Ich denke mal das SQLite das dann selbst Queued. Ich weiß es nur nicht. Und ich wünschte es gäbe jemand der das weiß. Sorry, bin etwas ratlos. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz