AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zugriff auf Datenbank serialisieren

Zugriff auf Datenbank serialisieren

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

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.619 Beiträge
 
Delphi 10.3 Rio
 
#1

Zugriff auf Datenbank serialisieren

  Alt 28. Mai 2020, 17: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
#PerfMatters
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.619 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Zugriff auf Datenbank serialisieren

  Alt 2. Jun 2020, 15:45
Ich nehme an das hier ist der falsche Ort?
Andreas
#PerfMatters
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.143 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zugriff auf Datenbank serialisieren

  Alt 3. Jun 2020, 07:08
Ist doch richtig hier, warum nicht ?
https://www.delphipraxis.net/198724-...t-firedac.html


Ich habe das jetzt nicht festgestelt, mache aber nur wenig Komplexes mit Sqlite.

Auszug von hier:
Zitat:
Many concurrent writers? → choose client/server

If many threads and/or processes need to write the database at the same instant (and they cannot queue up and take turns) then it is best to select a database engine that supports that capability, which always means a client/server database engine.

SQLite only supports one writer at a time per database file. But in most cases, a write transaction only takes milliseconds and so multiple writers can simply take turns. SQLite will handle more write concurrency that many people suspect. Nevertheless, client/server database systems, because they have a long-running server process at hand to coordinate access, can usually handle far more write concurrency than SQLite ever will.
Es könnte sein das Sqlite damit Schwierigkeiten hat, weil es nur für 1:1 Zugriff gedacht ist.

Geändert von Rollo62 ( 3. Jun 2020 um 07:14 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.619 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Zugriff auf Datenbank serialisieren

  Alt 4. Jun 2020, 10:27
Ist doch richtig hier, warum nicht ?
https://www.delphipraxis.net/198724-...t-firedac.html


Ich habe das jetzt nicht festgestelt, mache aber nur wenig Komplexes mit Sqlite.

Auszug von hier:
Zitat:
Many concurrent writers? → choose client/server

If many threads and/or processes need to write the database at the same instant (and they cannot queue up and take turns) then it is best to select a database engine that supports that capability, which always means a client/server database engine.

SQLite only supports one writer at a time per database file. But in most cases, a write transaction only takes milliseconds and so multiple writers can simply take turns. SQLite will handle more write concurrency that many people suspect. Nevertheless, client/server database systems, because they have a long-running server process at hand to coordinate access, can usually handle far more write concurrency than SQLite ever will.
Es könnte sein das Sqlite damit Schwierigkeiten hat, weil es nur für 1:1 Zugriff gedacht ist.
Ja ich dachte ja auch, dass ich immer nur mit einem Thread drauf zugreife. Aber um ein paar ecken kann es dann wohl doch dazu kommen das 2 threads darauf zugreifen...unter anderem weil Timer in Android mit Threads umgesetzt sind.
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.
Andreas
#PerfMatters

Geändert von QuickAndDirty ( 4. Jun 2020 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 18:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf