Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.884 Beiträge
 
Delphi 12 Athens
 
#1

Zugriff auf Datenbank serialisieren

  Alt 28. Mai 2020, 16:10
Datenbank: SQLite • Version: 3.xx • Zugriff über: Firedac
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:
  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';
Ich habe die Zeilen Hier 1 bis Hier 6 angepasst oder hinzuefügt.
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)
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat