Autor Beitrag
ProggyPeter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 07.01.11 00:47 
Ich möchte in den Wintermonaten ein bestehendes Projekt, welches im Sportbereich läuft, weiterentwickeln.
Hier bin ich mir noch nicht ganz über das Konzept bzw. den Lösungsweg im Klaren.
Deshalb würde ich mich über ein paar Meinungen und Denkanstöße freuen.

Ich habe ein Programmsystem, welches als C/S System mit 5 bis 10 Client läuft.
Als Server verwende ich Firebird, der Zugriff erfolgt über die IBDAC-Komponenten.

Auf den Clients erfolgen eine Vielzahl Eingaben, welche in die Datenbank übertragen werden.
Nach jeder Eingabe sind eine Reihe aufwendiger Berechnungen und Datensortierungen notwendig. Jeweils am Ende eines Wettbewerbs sind eine Reihe Auswertungen notwendig.

In der ersten Version habe ich diese Berechnungen auf dem Client ausgeführt und dann die Ergebnisse in die Datenbank zurückgeschrieben.
Das ist die kompakteste Lösung. Leider reagiert, besonderst bei aufwendigen Berechnungen, der Client dann etwas träge.
In einer weiteren Version habe ich dann die Geschäftslogik in StoredProcedure in die Firebird Datenbank verlegt.
Eine SP kann in meiner verwendeten FB Version nicht in einer eigenen TRansaction laufen.
Gerade bei aufwendigen Berechnungen kann es vorkommen, das die SP länger läuft und umfangreichere Modifizierungen am Datenbestand vornimmt.
Die SP wird praktisch von der folgenden Eingabe eines Clienten "überholt".
Hier tritt der Effekt auf, das gelegentlich (etwa 2 bis 4 mal am Tag) ein deadlook auftritt und das ganze Netz neu gestartet werden muss.
Ich hatte jetzt überlegt das Firebird Eventsystem zu verwenden und von einem Trigger bei Datenänderung ein externes Programm zu aktivieren, welches jetzt transactionsgesteuert, die Berechnungen vornimmt.
Hier hatte ich in der Vergangenheit jedoch Probleme, da der Eventmechanismus von Firebird nicht ganz sauber funktioniert. Gerade unter Windows-NT funktioniert der Eventmechanismus eine ganze Weile und setzt dann aus.
Eine weitere Überlegung ist die Berechnungen auf dem Client vorzunehmen, diese aber in einen OutofProcess-ComServer auszulagern.
Das eigentliche Programm stößt die Verarbeitung nur an und regeneriert nach einem Callback oder Event vom Comserver seine Tabellen.
Gibt es noch weitere Ideen, wie ich das Problem lösen kann?

Mit Gruß
ProggyPeter
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 07.01.11 13:46 
Hallo,
user profile iconProggyPeter hat folgendes geschrieben Zum zitierten Posting springen:
In der ersten Version habe ich diese Berechnungen auf dem Client ausgeführt und dann die Ergebnisse in die Datenbank zurückgeschrieben.
Das ist die kompakteste Lösung. Leider reagiert, besonderst bei aufwendigen Berechnungen, der Client dann etwas träge.

hast du die Berechnungen in deinem Hauptthread durchgeführt oder in einen Seeraten Thread ausgelagert? Denn wenn es wirklich die Berechnung ist, die so lange braucht und nicht der nötige DB zugriff, dann könnte ein einfacher Thread schon helfen (besonders wo Multicore Systeme mittlerweile Standard sind).

Ansonsten könnte man vielleicht versuchen, den Zeitpunkt der Berechnungen zu optimieren. Ist es wirklich nötig, dass diese immer nach jeder Eingabe durchgeführt werden, oder reicht es diese durch zu führen wenn die Ergebnisse angezeigt werden? Wenn die Anzeige seltener vorkommt könnte es sinnvoll sein die Berechnung erst bei dieser durch zu führen, auch wenn der Aufrufende user dann vielleicht ein paar Sekunden warten muss.

Gruß
Klabautermann
ProggyPeter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 07.01.11 15:49 
user profile iconKlabautermann hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Ansonsten könnte man vielleicht versuchen, den Zeitpunkt der Berechnungen zu optimieren. Ist es wirklich nötig, dass diese immer nach jeder Eingabe durchgeführt werden, oder reicht es diese durch zu führen wenn die Ergebnisse angezeigt werden? Wenn die Anzeige seltener vorkommt könnte es sinnvoll sein die Berechnung erst bei dieser durch zu führen, auch wenn der Aufrufende user dann vielleicht ein paar Sekunden warten muss.

Gruß
Klabautermann

Sowohl Berechnung, als auch Umorganisation der Daten in der Datenbank kosten Zeit. Es geht um eine etwas träge Reaktion des Client in der Größenordnung von <2 sec.
Die Berechnung muss nach jeder Eingabe durchgeführt werden, da sie danach sofort angezeigt wird, ins Internet übertragen wird und gegebenfalls dem Fernsehen bereitgestellt werden muss.

Mir geht es hier nicht vorrangig um die Geschwindigkeit, sondern um ein Konzept um solch ein verteiltes System zu optimieren.
Mit thread habe ich experimentiert. Hier macht aber die nicht thread sichere VCL Probleme.
Ich möchte den Client eigentlich zum reinen Erfassungsterminal abspecken.


Gruß
ProggyPeter
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Sa 08.01.11 00:47 
Hi,

schon mal überlegt, die Datenanzeige von der Datenerfassung zu trennen? Also auch Tabellentechnisch in der DB?

Die Clients geben die Daten in Tabelle A, B, C und D ein, die SPs ermitteln dann die Ergebnisse und speichern diese in die Tabellen E,F, G und H. Du verstehst was ich meine?

Grüße