AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zugriff auf Datenbank serialisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Datenbank serialisieren

Ein Thema von QuickAndDirty · begonnen am 28. Mai 2020 · letzter Beitrag vom 4. Jun 2020
 
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.999 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 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