Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zugriff via Zeos auf SQLite DB von mehren Threads (https://www.delphipraxis.net/169113-zugriff-via-zeos-auf-sqlite-db-von-mehren-threads.html)

TUX_der_Pinguin 29. Jun 2012 13:29

Datenbank: SQLite • Version: 3 • Zugriff über: Zeos

Zugriff via Zeos auf SQLite DB von mehren Threads
 
Hallo Leute,

in meiner Anwendung soll ein Hintergrund-Thread in regelmäßigen Abständen prüfen ob neue
Dateien/Daten vorliegen, diese sollen dann eingelesen und in der Datenbank gespeichert werden.

Der Anwender kann dann auf der Programmoberfläche nach diesen Daten suchen und sich anzeigen lassen.

In einem ersten Test habe ich eine "Connection" aufgebaut und sowohl der Hintergrund-Thread als
auch der Main-Thread (Programmoberfläche) greifen über diese eine Verbindung auf die Datenbank zu.
Jedoch scheint das zu Problemen zu führen da ich ab und zu Exceptions erhalte, ich vermute das sich
die Abfragen in die quere kommen. (Der Hintergrund-Thread benutzt Transaktionen zum Speichern der Daten).

Der zweite Versuch mit zwei getrennten "Connection" klappt auch nicht da wenn der Hintergrund-Thread
Daten in die DB speichert ist für den Main-Thread schein bar die DB geblockt. Was ja logisch wäre da
SQLite nicht Mulituserfähig ist.

Muss ich jetzt manuell regeln das sich die Abfragen nicht in die Quere kommen oder ist es doch möglich das
ein Hintergrund-Thread Daten in einer Datenbank speichern oder ändern kann während gleichzeitig der Main-Thread
Daten Abfragen kann. Der Main-Thread müsste nie Daten ändern oder hinzufügen können.

Mfg

TUX

p80286 29. Jun 2012 13:47

AW: Zugriff via Zeos auf SQLite DB von mehren Threads
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1172980)
Der zweite Versuch mit zwei getrennten "Connection" klappt auch nicht da wenn der Hintergrund-Thread
Daten in die DB speichert ist für den Main-Thread schein bar die DB geblockt. Was ja logisch wäre da
SQLite nicht Mulituserfähig ist.

Mit Multiuser hat das nichts zu tun (denke ich) eher sollte das record(?) locking hierfür verantwortlich sein.
wie wäre es wenn Du mit nur einen DB-Communication-Thread arbeiten würdest? Dann würde zumindestens Deine Datenbank Dir nicht in die Suppe spucken.
(ich kenne sql-light allerdings nicht gut genug)

Gruß
K-H

TUX_der_Pinguin 29. Jun 2012 14:20

AW: Zugriff via Zeos auf SQLite DB von mehren Threads
 
Ich habe da gerade was in den FAQ von SQLite gelesen

http://www.sqlite.org/faq.html#q5
Zitat:

Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.
...
When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY. You can adjust this behavior from C code using the sqlite3_busy_handler() or sqlite3_busy_timeout() API functions.

Das Problem ist nur wie kann ich SQLITE_BUSY abfragen bevor im Main-Thread eine neue Abfrage gestartet wird?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 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