AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Software-Datenmodell Redesign - Möglichkeiten

Ein Thema von SusiT · begonnen am 1. Aug 2024 · letzter Beitrag vom 4. Aug 2024
Antwort Antwort
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
459 Beiträge
 
Delphi 12 Athens
 
#1

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 1. Aug 2024, 11:16
Dann würde ich im ersten Schritt prüfen, ob der Flaschenhals tatsächlich bei den Clients oder am Server ist. Wenn es nur die Clients sind, würde ich das ganze System nicht über den Haufen werfen, sondern nur die Verarbeitung der Datensatzänderungen auf den Clients optimieren. Never change a running system.
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#2

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 1. Aug 2024, 13:08
Erstmal danke für eure schnellen Reaktionen und Anregungen.

Der Server sendet soweit zuverlässig und schnell, dort sehe ich soweit erstmal keine Probleme.

Gibt es denn DataSets, welche Threadsafe genutzt werden könnten?
Oder finden Zugriff innerhalb einer Multi-Thread-Anwendung auf DataSets generell nur via CriticalSections o.Ä. statt?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#3

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 1. Aug 2024, 15:11
Gibt es denn DataSets, welche Threadsafe genutzt werden könnten?
Oder finden Zugriff innerhalb einer Multi-Thread-Anwendung auf DataSets generell nur via CriticalSections o.Ä. statt?
Soweit ich weiß, gibt es das nicht.

Das hat aber auch den Hintergrund, dass du Locks bei einer eigenen Implementierung optimieren kannst, während eine allgemeine threadsichere Implementierung alles absichern müsste.

FireDAC ist z.B. bei reinen Lesezugriffen auf geklonte Datasets threadsafe.

Eine Idee zur Optimierung:
Halte einfach für jeden Client zwei DataSets vor. Eins ist das, das bei einer Anfrage geliefert wird, das andere bekommt ein Update. Nach dem Update tauschst du threadsicher die beiden DataSets aus.

Das hat den Vorteil, dass eine Datenanfrage immer schnell beantwortet wird, dafür eine im Moment der Anfrage eingespielte Datenänderung erst bei der nächsten Lieferung enthalten ist.

Ich bin gerade im Urlaub und schreibe am Handy. Insofern kann ich aktuell schlecht recherchieren.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
459 Beiträge
 
Delphi 12 Athens
 
#4

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 1. Aug 2024, 15:12
Gibt es denn DataSets, welche Threadsafe genutzt werden könnten?
Das kann ich mir kaum vorstellen. Ich würde die Datenaktualisierung auch immer nur seriell vornehmen. Wenn z.B. ein Datensatz geändert und kurz danach gelöscht wird (auf dem Server), und der Client verarbeitet die beiden Änderungen nicht seriell, könnte der Datensatz im Client zuerst gelöscht und dann... nicht mehr gefunden werden.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#5

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 1. Aug 2024, 17:10
Ich könnte mir vorstellen, dass ein Abrufen der Daten mit einer TFDQuery unter den FireDAC-Regeln für Multi-Threading mit anschließend synchronisierter Übergabe an ein TFDMemTable in den Hauptthread durch simples Zuweisen des Data Properties ein brauchbarer Ansatz wäre.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#6

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 2. Aug 2024, 10:46
@PapaSchlumpf73:

Da hast du vollkommen recht, dieses Szenario habe ich so nicht bedacht.

@jaenicke:

Die Idee für die Optimierung klingt einleuchtend. Im Grunde halte ich dann ein CDS in einem separaten Event-Thread welcher die Updates erhält und in sein CDS einfügt.
Nach dem erfolgreichen Einfügen könnte ich den kompletten Inhalt des CDS dann in das CDS im MainThread kopieren.

Wäre es auch möglich via CloneCursor die Anzeige im MainThread auf die im Event-Thread zu referenzieren? Im Grunde "lese" ich die Daten ja ausschließlich im MainThread um sie dort dem Benutzer zu präsentieren. Oder geht das mit herkömmlichen ClientDataSets nicht und ich müsste auf die FireDac Äquivalente umsteigen?


@Uwe Raabe:

Das ist so leider nicht möglich da die Clients keine direkte Verbindung zur Datenbank haben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#7

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 2. Aug 2024, 12:31
Bei DataSnap, bzw. RAD-Server, sowie auch einigen anderen IPC-Frameworks,
kann man DataSets als Parameter übergeben und als VAR-Parameter oder Result abrufen.

Die DB-Verbindung oder sonstwas wäre in der Middleware (Server) und die Clients bekämen die Daten von dort durchgereicht.



Für langsame Query, hatten wir mal eine Liste von DataSets im Apps, dort wurden sie regelmäßig in einem Thread aktualisiert
und dann konnten die Clienten sie gemütlich abrufen.

* der Aufruf der Runterladfunktion kommt je in einem Thread an
* dort wurde via CriticalSections das jeweilie DataSet kurz gesperrt
* dann schnell in ein MemoryDataset (z.B. dxMemData oder CDS) umkopiert
* anschließend das MemoryDataset als Result rausgegeben (mit OwnsObjects, damit Datasnap das dann freigibt, wenn fertig)
* im Client kam dann eine Kopie dieses Datasets an (das lief in einem DownloadThread)
* und anschließend wurde das DataSet im Hauptthread (Synchronize) ans Grid gehängt (das alte DataSet dabei freiegeben)

Inzwischen nutzen wir aber MATERIALIZED VIEWs im Postgres, welche die Clients vom DBServer laden, und die regelmäßig über den Apps aktualisiert werden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#8

AW: Software-Datenmodell Redesign - Möglichkeiten

  Alt 4. Aug 2024, 06:44
Wäre es auch möglich via CloneCursor die Anzeige im MainThread auf die im Event-Thread zu referenzieren?
Ich kenne die Interna eines ClientDataSets zu wenig um das zu beantworten. Laut Cary Jensen sollte das aber gehen.
Zitat:
So long as no code needs to make changes to Data or Delta, the ClientDataSet is thread safe.
Er hat zum ClientDataSet ein ganzes Buch geschrieben. Das Thema Threads findest du auch in seinem Blogeintrag:
https://caryjensen.blogspot.com/2011...rsors.html?m=1
Ich empfehle dir, dass du dir das genau anschaust, was er dazu schreibt. Ich habe das nur überflogen.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 4. Aug 2024 um 06:46 Uhr)
  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 20:05 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