Forum: PC-Programmierung Zugriff auf SQLIte DataBase von zwei unterschiedliche Systeme


von Bern_Gast (Gast)


Lesenswert?

Hallo Zusammen
ich habe eine "SQLite" DatenBank erstellt.
Auf dieses Datenbank werden zwei Systeme zugreifen.
Einmal mit Labview und Visual Studio C++.


Kommt eigentlich SQLIte damit klar oder ist das Kritisch?
Ich bin noch in der Spezifikationphase.

Was ich noch vergessen habe:

1) Von Labview Seite wird die DB nur eingelesen
2) Von C++ werden Messdaten geschrieben


danke in voraus

von Clemens L. (c_l)


Lesenswert?

Wenn Betriebssystem und Dateisystem das File Locking korrekt 
implementieren, gibt es kein Problem. (Solche Fehler findet man meist 
bei Netzwerk-Dateisystemen.)

von Bern_Gast (Gast)


Lesenswert?

Clemens L. schrieb:
> das File Locking korrekt
> implementieren

Was meinst du damit?


Mir ist wichtig, dass die beide Systeme sich gegenseitig nicht stören 
sollen.

Ich meine das Schreiben von System1 soll einwandfei sei und auch genau 
so das Einlesen von System soll auch flott und problemlos laufen

von Scelumbro (Gast)


Lesenswert?

Bern_Gast schrieb:
> Clemens L. schrieb:
>> das File Locking korrekt
>> implementieren
>
> Was meinst du damit?
>
> Mir ist wichtig, dass die beide Systeme sich gegenseitig nicht stören
> sollen.
>
> Ich meine das Schreiben von System1 soll einwandfei sei und auch genau
> so das Einlesen von System soll auch flott und problemlos laufen

Ich denke die entscheidende Frage ist, ist es vorgesehen bzw. kann es 
irgendwie passieren, dass beide Programm gleichzeitig auf die DB Datei 
zugreifen wollen?

von Klaus P. (Gast)


Lesenswert?

Bern_Gast schrieb:
> ich habe eine "SQLite" DatenBank erstellt.
> Auf dieses Datenbank werden zwei Systeme zugreifen.
> Einmal mit Labview und Visual Studio C++.
>
> Kommt eigentlich SQLIte damit klar oder ist das Kritisch?

Steht im Manual: https://www.sqlite.org/lockingv3.html

von Dirk D. (dicky_d)


Lesenswert?

Scelumbro schrieb:

> Ich denke die entscheidende Frage ist, ist es vorgesehen bzw. kann es
> irgendwie passieren, dass beide Programm gleichzeitig auf die DB Datei
> zugreifen wollen?

... und vor allem wie deine definition von GLEICHZEITIG ist, wenn beides 
in einem ms Slot passieren kann sollte das kein Problem darstellen.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Man kann für jedes SQLite-SQL-Kommando einen timeout setzen,
SQLite führt das Teil dann aus wenn es geht.

zB eine immmediate transaction.

Datenbanken kann man auch read-only öffnen.

von Bern_Gast (Gast)


Lesenswert?

Scelumbro schrieb:
> Ich denke die entscheidende Frage ist, ist es vorgesehen bzw. kann es
> irgendwie passieren, dass beide Programm gleichzeitig auf die DB Datei
> zugreifen wollen?

100% ausschliessen kann ich nicht.

von Data (Gast)


Lesenswert?

Moin,

bisher dachte ich immer; Mit einer Datenbank kommuniziert man über APIs. 
Und eine Datenbank ist Multiuserfähig. So zumindest die SQL Datenbanken 
mit denen ich täglich arbeite.

Ich habe eine DB die wird lesen und schreiben von Java, PHP und C 
Clients bearbeitet. Die Anzahl der User liegt im Mittel bei 80 Usern.

Deshalb nimmt man Datenbank Systeme. Um den Dateizugriff kümmert sich 
das System.

Oder etwa nicht?

von Bern_Gast (Gast)


Lesenswert?

Mit dem DataBase geschieht folgende:

System1:
1)DataBase wird nur geöffnet.
2)SQL Statment "Select" wird ausgeführt (also nur Read-mode).
3)Database schliessen

System2:
1)Database wird geöffnet.
2)Messadaten in DaaBase schreiben
3) DataBase schliessen

--> Dieses Ablauf wird sich stets wiederholen.
    Also die reihenfolge ist festgelegt und es ist fast unmöglich,
       dass die beide Systeme gleichzeitig auf die DB zugegriffen wird.

von Peter II (Gast)


Lesenswert?

Data schrieb:
> Oder etwa nicht?

bei SQLIte gibt es aber kein Datenbanksystem. Die Datenbank ist komplett 
im Treiber implementiert.

Wenn mehre User auf eine Datei zugreifen, dann gibt es keinen 
gemeinsamen DB-Prozess der die zugriffe koordiniert. Das muss jeder 
Prozess mit Hilfe vom file-locking machen.

Aus dem Grund wird es bei mehre Usern nicht wirklich schnell werden

von Peter II (Gast)


Lesenswert?

Bern_Gast schrieb:
> 1)DataBase wird nur geöffnet.
> 2)SQL Statment "Select" wird ausgeführt (also nur Read-mode).
> 3)Database schliessen

warum immer öffnen und schließen? Ich dachte es soll bei dir schnell 
sein? Damit müssen ja Indizes ständig neu geladen werden.

von Bern_Gast (Gast)


Lesenswert?

Peter II schrieb:
> warum immer öffnen und schließen? Ich dachte es soll bei dir schnell
> sein? Damit müssen ja Indizes ständig neu geladen werden.

Grund dafür, dass die dataBase von zwei unterschiedliche Systeme 
zugegriffen wird.

Schnell muss es auch sein.

von Peter II (Gast)


Lesenswert?

Bern_Gast schrieb:
> Grund dafür, dass die dataBase von zwei unterschiedliche Systeme
> zugegriffen wird.

das bekommt SQLLite auch so hin

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

Bern_Gast schrieb:
> Kommt eigentlich SQLIte damit klar oder ist das Kritisch?
> Ich bin noch in der Spezifikationphase.
ja ist möglich, Erklärung kommt gleich...

Klaus P. schrieb:
> Steht im Manual: https://www.sqlite.org/lockingv3.html
Jupp, hier wird der Mechanismus erläutert, der da greift...

Peter II schrieb:
> bei SQLIte gibt es aber kein Datenbanksystem. Die Datenbank ist komplett
> im Treiber implementiert.
naja, SQLite ist schon eine Datenbank, eine sogenannte "eingebettete" 
Datenbank. Und ja, die Zugriffsschicht ist nicht in einem zentralen 
Dienst, wie z.B. bei Oracle, MySQL etc., implementiert, der die Zugriffe 
koordiniert. Vielmehr gibt es eine API, die jeder beteiligte Prozess 
verwenden sollte und in der auch Mechanismen zur Zugriffssteuerung auf 
die DB zur Verfügung gestellt werden (und auch richtig angewendet werden 
sollten, um Dateninkonsistenzen zu vermeiden!).

Peter II schrieb:
> Wenn mehre User auf eine Datei zugreifen, dann gibt es keinen
> gemeinsamen DB-Prozess der die zugriffe koordiniert. Das muss jeder
> Prozess mit Hilfe vom file-locking machen.
Nein, nicht das "File-Locking" des OS ist da entscheidend, sondern eben 
die erwähnten Mechanismen, die die die API zur Verfügung stellt...!

Ich verwende aus verschiedenen Gründen, teilweise historisch bedingt, 
auch eine SQLite-DB zur Aufzeichnung und Bereitstellung von Messwerten. 
Dabei spielen ebenfalls mehrere unabhängige Prozesse im System 
(teilweise über mehrere Rechner verteilt) mit.

Beim Schreiben von Daten in die DB wird, durch die API ein Lock-Flag in 
der SQLite-DB selbst gesetzt. Bei jedem schreibenden und lesenden 
Zugriff wird durch die API dieses Flag abgefragt. Ist es gesetzt, wird 
eine entsprechende Fehlermeldung generiert, auf die im entsprechenden 
Programm sinnvoll reagiert werden sollte! Für einen schreibenden Prozess 
sollte es also z.B. bedeuten, dass er die Schreibanforderung puffern und 
es später noch einmal versuchen muss. Dieses Lock-Flag wird, nebenbei, 
nicht nur bei schreibenden Zugriffen gesetzt, sondern z.B. bei einem 
SQLite-internen Dump, Backup oder einer gesetzten Transaktion, bei dem 
die Daten auch konsistent bleiben sollen.

Ich habe die Sache sogar soweit getrieben, dass ich seit neuesten die 
Erfassung der Messwerte und das Schreiben in die DB auf zwei Prozesse 
verteilt habe. Die Prozesse kommunizieren via TCP/IP miteinander. Der 
Erfassungsprozess sendet also seine Insert-Statments zum Schreibprozess, 
der diese dann, wenn möglich, in die DB hämmert. Kann er dies nicht kann 
(z.B. DB locked), sendet er eine entsprechende Fehlermeldung an den 
Erfassungsprozess zurück, der die Inserts dann puffert und es irgendwann 
nochmal versucht. Das hat dann auch den Charme, dass man den "Schreiber" 
einfach mal stoppen kann und Wartungsaktionen o.ä. auf der DB 
durchführen kann, ohne dass Messdaten verloren gehen...

Ich habe letztes Jahr mal auf verschiedenen Linux-Veranstaltungen einen 
Vortrag zu dem Thema gehalten, hier die Folien dazu:
https://chemnitzer.linux-tage.de/2015/de/programm/beitrag/144

Grüße Uwe

von Clemens L. (c_l)


Lesenswert?

Bern_Gast schrieb:
> Clemens L. schrieb:
>> das File Locking korrekt
>> implementieren
>
> Was meinst du damit?

Dass es in der Praxis meist läuft. Ausnahmen sind irgendwelche NAS, wo 
Locking ausgeschaltet wird, damit Benchmarks schneller laufen, oder 
nicht korrekt konfigurierte NFS-Implementationen, oder Windows-Systeme, 
die sich zwischendurch aufhängen (oplocks in SMB setzen voraus, dass 
sich alle Systeme schnell genug melden).

Siehe auch http://www.sqlite.org/howtocorrupt.html.

von Bern_Gast (Gast)


Lesenswert?

Hi Zusammen,

ich habe folgende Problem:

Änderung der DB werden nicht gechekt, wenn ich diese ändere.
Die DB ist immer gleichgeblieben, obwohl sie nicht mehr aktuell ist.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Aha. Gechekt. Neuer IT-Slang ? Geht's auch in verständlich ? ;)

von Bern_Gast (Gast)


Lesenswert?

Joachim D. schrieb:
> Aha. Gechekt. Neuer IT-Slang ? Geht's auch in verständlich ? ;)
Sorry

Änderung der DB werden nicht gemerkt

von Peter II (Gast)


Lesenswert?

Bern_Gast schrieb:
> Änderung der DB werden nicht gemerkt

von wem? Was ist wenn du das Programm neu startest sind sie dann drin? 
commit vergessen?

von Bern_Gast (Gast)


Lesenswert?

habe commit vergessen
Danke

von Rolf M. (rmagnus)


Lesenswert?

Bern_Gast schrieb:
> --> Dieses Ablauf wird sich stets wiederholen.
>     Also die reihenfolge ist festgelegt und es ist fast unmöglich,
>        dass die beide Systeme gleichzeitig auf die DB zugegriffen wird.

Die fiesesten Bugs, die es gibt, sind die, deren Auftreten "fast 
unmöglich" ist.

von Dirk D. (dicky_d)


Lesenswert?

Rolf M. schrieb:
> Bern_Gast schrieb:
>> --> Dieses Ablauf wird sich stets wiederholen.
>>     Also die reihenfolge ist festgelegt und es ist fast unmöglich,
>>        dass die beide Systeme gleichzeitig auf die DB zugegriffen wird.
>
> Die fiesesten Bugs, die es gibt, sind die, deren Auftreten "fast
> unmöglich" ist.

An der stelle gibt das aber kein Bug sondern einfach nur nen klleines 
bisschen wartezeit wegen dem lock :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.