AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi "Single-User" -> "Multi-User" + SQLite
Thema durchsuchen
Ansicht
Themen-Optionen

"Single-User" -> "Multi-User" + SQLite

Ein Thema von wjjw · begonnen am 21. Feb 2019 · letzter Beitrag vom 24. Feb 2019
Antwort Antwort
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
558 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 22. Feb 2019, 13:38
Es hat keinen Sinn DMBS Funktionalität in einer Anwendung nachzubauen und schon gar nicht in einer Enduser Anwendung. Selbst die SAP ist froh, dass sie diese Hintegrundverbuchungsprozesse los ist und selbst die laufen in einer isolierten Serverapplikation. Viel mehr User als an deiner Anwendung angemeldet waren auf einem Host auch nicht gleichzeitig aktiv.

Solche Aufgaben erledigt an sich eine Middleware oder du baust die Fähigkeiten der DBMS auf der Business Ebene nach. Darunter leiden alle auf Nachrichten basierten Architekturen.

Was eine DB langsam macht ist der Overhead der Transaktionen und damit verbunden die Aufrechterhaltung der Konsistenz bspw... ACID.

Mal von den bereits genannten Vorschlägen abgesehen.

Du kannst einen Verbuchungsprozess machen der übermittelte Dateien einbucht. Das käme einer Nachricht nahe. Zum Zwecke der Verarbeitung kannst du einen Webserver hernehmen. Der Request an einen Webserver wird vor seiner Bearbeitung genauso in eine File geschrieben.

Mehr als eine Fire und Forget Nachricht die eine nice to have Information beinhaltet würde ich nicht direkt an solch eine Anwendung schicken.

---

SQLite ist ganz gut, wenn man Daten repliziert und viel liest oder lokal hält.

Hallo!

Ich habe ein Programm das bis dato im "Single-User" Modus läuft.
Nun soll das Programm auf Multi-User laufen - was bei mir folgendes heisst:
A) Im Hauptprogramm "X" arbeitet ein Benutzer (Windows, Android, iOS)
B) Die Companion-App "Y" läuft auf mehreren mobilen Gräten (Android, iOS, Windows)
C) Die mobilen Apps "Y" schicken Daten an das Hauptprogramm "X"
D) Alle Programme kommunizieren im lokalen Netzwerk (kein Internet oder Cloud)

Nun möchte ich nicht das Hauptprogramm "zu viel" durch die mobilen Apps blockieren und umgekehrt -> Threads.
Problem ist das ich als Datenbank SQLite einsetze (da es auf jeder Platform verfügbar).
Die Datenbankoperationen hab ich schon gekappselt.
Es gibt einige Techniken das umzusetzen, jedoch welche passt bei dem Fall am Besten? TWorker, Critical Sections, ...
Die Datenpakete, die ich von den mobilen Apps bekomme, sind nicht groß - im Prinzip einzelne Datensätze bis zu 50 an der Zahl.

Vielleicht hat ja jemand eine Idee oder ein ähnliches Projekt umgesetzt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 22. Feb 2019, 13:44
Zitat:
Wie bei meiner Beschreibung erwähnt läuft das Hauptprogramm auf allen Platformen (nicht nur Windows). Daher denke ich mal das ich z.B. Oracle auf iOS nicht zum laufen bringe...
Braucht es auch nicht, wenn man den Datenzugriff abstahiert.
Zitat von mkinzler:
GGf. zusätzlich den Datenzugriff per REST kapseln, für den Zugriff von mobilen Geräten ist das sowieso sinnvoll.
Die Speicherung der lokalen Daten kann dann ja in SQLite, FireBird embedded oder IBLite erfolgen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von wjjw
wjjw

Registriert seit: 3. Aug 2017
Ort: Wiener Neustadt, Österreich
75 Beiträge
 
Delphi 12 Athens
 
#3

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 22. Feb 2019, 13:59
Die Kommunikation mit den Clients läuft ja schon perfekt (via Webserver Multi-Thread).
Nun muss ich nur doch die Threads „richtig“ abarbeiten. Speziell DB Operationen. Dazu dachte ich mur das es da vielleicht ein Framework oder Best Practice gibt.
Diser Post sollte dem Zweck dienen.
Also: die Threads synchronisieren / Queuing, ...
Das Hauptprogramm selbst hat einen Thread und der Webserver bekommt von den Clients auch die Nachrichten. Jetzt möchte ich beide so verbinden, das keiner zu lange warten muss bzw. blockiert wird, was als eine nicht verarbeitete Übertragung bedeuten würde.
Werner Weiß
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 22. Feb 2019, 14:11
Warum nicht per REST?
Zitat:
Dazu dachte ich mur das es da vielleicht ein Framework oder Best Practice gibt.
REST. da gibt es im Delphi-Umfeld Lösungen wie DataSnap, Mars, DelphiMVC, DataWare, ...
Markus Kinzler
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
558 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 22. Feb 2019, 15:47
Das ehrt deine Programmierkünste hilft aber Ende nicht allzuviel.

Läuft in dem Thread der Anwendung der Webserver?

Du bist in der Situation aus Sicht der Anwendung dass du viele Formulare offen hast auf denen ein Timer sitzt der per Zufallszahl einen ButtonClick resp. eine andere Ereignisbehandlung auslöst. Da hilft es auch nicht viel wenn du den 'Webserver' in der Anwendung laufen hast, denn du musst dauern den GUI Thread unterbrechen.

Eigentlich wäre deine Applikation am PC eine Anwendung die vom 'Server' gestartet wurde und nicht umgekehrt.

Du kannst einen Thread machen der eine DB Operation nach der anderen durchführt. Es macht auf jeden Fall Sinn den Empfang der Nachrichten von der Verbuchung zu entkoppeln. Schreibe die empfangene Nachricht in eine File und verbuche sie im Hintergrund.

Sobald du mit Messages und Queuing arbeitest sagst du zurecht der Anwendung ist egal was mit den Daten passiert, sie übergibt nur an den der die Daten weiterschickt und der weiß schon wohin.

Critical Section bieten sich. Ich würde aber nicht soweit gehen, dass ich unter der Kontrolle einer Anwendung mehre Nachrichten empfangende Threads mache die dann mit einem Pool von DB Writer und DB Reader Prozessen kommunizieren.

Da hast du bspw. in PHP denn in dem Fall synchronisiert der Runtime die DB Sessions.

Ich persönlich würde diese Verarbeitung hinter einen isoliert laufenden Webserver stecken. Damit hat du zumindest den Empfang vom Verbuchen entkoppelt.

Critical Sections bieten sich zur Synchronisation an.


Die Kommunikation mit den Clients läuft ja schon perfekt (via Webserver Multi-Thread).
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 23. Feb 2019, 04:46
Ich persönlich würde die Kommunikation und das DB Handling in ein eigenes Serverprogramm ohne GUI (Dienst/Daemon) auslagern. Das Serverprogramm nimmt die Daten der Clients entgegen, packt diese in eine Que. Ein eigener Thread des Serverprogramm arbeitet die Que ab und trägt diese in die DB ein.

Vorteile:

- Keine Synchronisatzion mit einer GUI
- Keine Blockade der Clients
- Wenns zuviel wird, kann man das ganze auf einen eigenen Rechner auslagern.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 23. Feb 2019, 11:05
Ich persönlich würde die Kommunikation und das DB Handling in ein eigenes Serverprogramm ohne GUI (Dienst/Daemon) auslagern. Das Serverprogramm nimmt die Daten der Clients entgegen, packt diese in eine Que. Ein eigener Thread des Serverprogramm arbeitet die Que ab und trägt diese in die DB ein.
Sicherlich ein guter Vorschlag!

Aber muss man nicht in jeder App, egal ob Windows, iOS oder Android, die Datenbankzugriffe kapseln?

Ich hatte noch nie ne App bei der ich nicht Daten in einem Thread weg schreibe oder Daten lese, während die UI auch Daten anfordert oder schreiben möchte?

Wenn ich also immer asynchron mit CRUD arbeite habe ich "keine" Probleme egal wie die Anwendung aus sieht.

Es gibt natürlich Situationen, wo die UI auf ein Ergebnis der Datenbank warten muss. Aber wovon sprechen wir hier? 250ms? 1s? 3s?

Wenn ich auf einen Button klicke, erwarte ich eine sofortige Reaktion. IMMER, damit sich die Anwendung flüssig "anfühlt". Wenn also ein Zugriff länger dauert, muss ich sowieso eine Art von Stundenglas/Wait-Animation anzeigen.
Naja und die kann sich auch nur flüssig drehen, wenn mein DB-Zugriff in einem eigenen Thread ist...

Also sind ALLE Datenbankzugriff immer in einem Thread. Hier also einen Queue einzufügen, die dann auch gerne Datenbankanfragen von mehrerer Quellen abhandeln kann ist kein Hexenwerk. Wenn ich dann noch anfragen der lokalen App bevorzuge, läuft alles schnell und sauber.

Wäre es nicht schön, wenn es für Firemonkey ein Framework gäbe, dass so etwas kann?

Mavarik
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: "Single-User" -> "Multi-User" + SQLite

  Alt 24. Feb 2019, 06:22
Naja, einfach ist es schon.

Die Frage nach der Priorisierung der Zugriffe, ist eine Frage, wie aktuell die Daten für die Clients sein müssen.

Beispiel:

Client A braucht unbedingt die Daten von Client B, die dieser gerade in die Que zum eintragen geschickt hat.

Dann sollte der Schreibzugriff natürlich oberste Prio haben.

Eine andere Situation, die man noch berücksichtigen könnte, wäre, das die Clients auch "Offline" arbeiten können sollen. Dann wärs sinnvoll die Clients mit einer eigenen "lokalen" DB arbeiten zu lassen, die dann entsprechend mit der zentralen Version synchronisiert werden.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:14 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