AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLITE3 Multithreaded geht das?
Thema durchsuchen
Ansicht
Themen-Optionen

SQLITE3 Multithreaded geht das?

Ein Thema von QuickAndDirty · begonnen am 2. Aug 2017 · letzter Beitrag vom 9. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
QuickAndDirty

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

SQLITE3 Multithreaded geht das?

  Alt 2. Aug 2017, 14:09
Datenbank: SQLITE • Version: 3 • Zugriff über: Firedac
Hallo,
Ich weiß, dass Firedac mit dem FDManager und über separate Connections pro Thread threadsicher ist.
Desweiteren habe ich gelesen, dass es wohl in den Sourcen von SQLITE einen Schalter für eine multithread-fähige SQLITE Version gibt.

Die Frage: Kann ich eine SQLite3 Datenbank mit Firedac aus mehreren Threads heraus nutzen?

Es ist so, dass ich eine App habe, welche Downloads in die Datenbank speichert und das blockiert zum Teil die Oberfläche arg. Ich würde das gerne auslagern in einen Hintergrundthread.
Ich muss aber gleichzeitig die Datenbank weiter aus dem Hauptthread heraus nutzen...die App ist quasi die Datenbank.

Habe ich da 'ne Chance?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: SQLITE3 Multithreaded geht das?

  Alt 2. Aug 2017, 14:59
Falls es nicht gehen sollte, was ich nicht weiß, hast du schon die Alternative in Betracht gezogen, die Datei temporär auf dem Gerät zu speichern und erst nach dem Download in die Datenbank zu schieben?
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: SQLITE3 Multithreaded geht das?

  Alt 2. Aug 2017, 16:10
Falls es nicht gehen sollte, was ich nicht weiß, hast du schon die Alternative in Betracht gezogen, die Datei temporär auf dem Gerät zu speichern und erst nach dem Download in die Datenbank zu schieben?
Ja. Ich mache das ja bereits so.
Das Anlegen in der DB dauert aber einfach sehr lange:
Paremetrisiertes Insert-Statement ist prepared, alles innerhalb einer Transaktion geschrieben und am Ende commited.

Ich brauche einen Thread.

Wenn Multitreading nicht geht. Könnte ich immer noch einen Thread nutzen der alle DB Zugriffe ausführt, während sich die APP aus einem Cache bedient.
Oder ich lagere die Tabellen, welche von solchen größeren Downloads betroffen sind in eine separate Datenbank aus, so dass der Rest der App noch Zugriff auf die Datenbank hat.
Oder ich versuche dafür zu sorgen das wirklich nur die Differenz der Datenbestände zwischen App und Server runtergeladen und in die DB eingepflegt wird, dann müsste ich allerdings,vermutlich serverseitig etwas ändern... und das könnte aufwändige Updates der Server bei den betroffenen Kunden nach sich ziehen...

[Edit]
Ich habe das Hauptproblem(ein Programmierfehler) aber gelöst. Es arbeitet jetzt flott, aber eben nur auf der kleinen Testdatenmenge. Für große Datemmengen wäre es immer noch wünschenswert einen Hintergrundthread zu haben.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 2. Aug 2017 um 16:39 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: SQLITE3 Multithreaded geht das?

  Alt 2. Aug 2017, 16:21
Dir ist bewusst, dass SQLite nicht zum Speichern von größeren Dateien in der DB geeignet ist? Die Performance ist dann unterirdisch.

https://www.sqlite.org/intern-v-extern-blob.html
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: SQLITE3 Multithreaded geht das?

  Alt 2. Aug 2017, 16:25
Zwei gleichzeitige Zugriffe auf SQLite, einen aus der UI und einen aus eine Thread geht nicht.

Ich habe erst kürzlich hierzu für einen Kunden eine Threaded Prioritäts-Queue programmiert, die genau das macht...

Verarbeitung geht dann alles in einen Thread und wenn die UI etwas braucht, kommt die Abfrage sobald es möglich ist...

Mavarik
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: SQLITE3 Multithreaded geht das?

  Alt 7. Aug 2017, 12:08
Zwei gleichzeitige Zugriffe auf SQLite, einen aus der UI und einen aus eine Thread geht nicht.

Ich habe erst kürzlich hierzu für einen Kunden eine Threaded Prioritäts-Queue programmiert, die genau das macht...

Verarbeitung geht dann alles in einen Thread und wenn die UI etwas braucht, kommt die Abfrage sobald es möglich ist...

Mavarik
Das habe ich befürchtet.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: SQLITE3 Multithreaded geht das?

  Alt 7. Aug 2017, 12:12
Dir ist bewusst, dass SQLite nicht zum Speichern von größeren Dateien in der DB geeignet ist? Die Performance ist dann unterirdisch.

https://www.sqlite.org/intern-v-extern-blob.html
Mir ist das klar. Aber wenn ein Kunde sagt, er möchte einen großen Teil seiner Server-Datenbank offline und tagesaktuell im Handy benutzen können...
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: SQLITE3 Multithreaded geht das?

  Alt 7. Aug 2017, 12:58
Wir haben es bei unserer App so gelöst, dass nur die Metadaten in der SQLite-DB gespeichert sind, die eigentlichen Binär-Dateien liegen so im Dateisystem (verschlüsselt, da das für die Daten notwendig ist).

Ein richtiges Paralleles Schreiben in die Datenbank funktioniert nicht, aber über TCriticalSection ist es möglich, dass mehrere Threads auf dieselbe DB schreiben/lesen.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: SQLITE3 Multithreaded geht das?

  Alt 7. Aug 2017, 13:12
Wir haben es bei unserer App so gelöst, dass nur die Metadaten in der SQLite-DB gespeichert sind, die eigentlichen Binär-Dateien liegen so im Dateisystem (verschlüsselt, da das für die Daten notwendig ist).

Ein richtiges Paralleles Schreiben in die Datenbank funktioniert nicht, aber über TCriticalSection ist es möglich, dass mehrere Threads auf dieselbe DB schreiben/lesen.
Ok, ich würde lieber einen TMonitor nehmen, aber egal...

Mehrere Threads sind ja nicht das Problem... In der Regel will man ja ggf. das die UI auch mal was aus der Datenbank lesen kann...

Da hilft es nicht, wenn der Thread steht und auf die Freigabe wartet, da die UI zwar - wenn event getrieben über den Thread - reaktive bleibt, aber kein Ergebnis liefert.

Mavarik
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

AW: SQLITE3 Multithreaded geht das?

  Alt 7. Aug 2017, 13:55
Ok, ich würde lieber einen TMonitor nehmen, aber egal...
Was ist der Vorteil von TMonitor? Ich glaube wir hatten das auch mal untersucht und waren zu dem Fazit gekommen, dass TMonitor deutlich langsamer als TCriticalSection ist (siehe auch: https://www.delphitools.info/2013/06...iticalsection/ )
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz