AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Anwendungsdesign: Datenbankanwendung, Refresh.
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendungsdesign: Datenbankanwendung, Refresh.

Ein Thema von DSCHUCH · begonnen am 17. Feb 2013 · letzter Beitrag vom 18. Feb 2013
Antwort Antwort
Seite 2 von 2     12   
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#11

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 20:47
das ist nicht möglich, teilweise braucht die datenbank solange. oder zB eine 10 jahresauswertung und man weiß auch nie, welche interessanten einschränkungskriterien der nutzer eingibt.

nimm mal das bsp einer aussenstelle via vpn über dsl anbindung an. man kann doch nicht die komplette anwendung umprogrammieren, nur weil ich eine langsame verbindung habe.
Grundsätzlich sollte man die Anwendung, die Abfragen und die Datenbank so bauen, das es eben keine bzw. kaum Wartezeiten gibt.
Wie beschrieben entscheidet das zB der Anwender, bei den Dingen die er abfragt etc. Oder das Netzwerk, wenn es eben mal zB kurz klemmt, da zB übertragung via Richtfunk zwischen den Hallen stattfindet, seit Virtualisierung entscheidet dies manchmal sogar das Cadsystem, wenn es gerade massig daten schreibt und der cluster ausgelastet ist und selbst die einfachsten Dinge sekundenlang brauchen.

Wenn ich nur 1x pro Jahr meine Jahresauswertung fahre, dann benötige ich keine Optimierung (z.B. DWH), aber ansonsten richtet man eben eins ein. Und wenn das immer noch ein Overkill ist, dann werden eben entsprechende redundante Tabellen eingebaut.
Vorhanden. Man weiß aber wiederrum nicht, wie der Anwender es bedient. 5 Sekunden bis "Ihre Anwendung reagiert nicht mehr" ist nicht lang, bei vielen Daten. Wir verwenden für den Anwender zB http://www.devexpress.com/Products/VCL/ExPivotGrid/ für das Customizing. Und auch da gibt es zT das Problem, das es bei (wirklich riesen) Datenmengen beim Umsortieren hängt. (zB hat mir ein Anwender das vor kurzem gezeigt, als er 1 mio Datensätze zum Energieverbrauch seines Glühofens geladen hatte [das wird in einem thread gemacht da hier die Wahrscheinlichkeit für sowas hoch ist] und anschliessend umsortiert bzw. summiert <= Laufzeit länger 5 Sekunden.

Und Paging übers Netz ist ja auch kein Problem. Und DAS ist keine Programmierung extra für eine langsame Verbindung, sondern eine nachhaltige.
Auch hierfür gibt es bei SQL Servern einfache Möglichkeiten, zB CursorFetch usw.
Zusätzliche Layer - solche Techniken kann man sicher verwenden - führt aber natürlich auch sofort zu Geschwindigkeitseinbusen.

Jedoch weiß ich prinzipiell auch hier nicht, wie lange es braucht. Spielt auch keine Rolle, jeder Netzwerktraffic kann mal hängen, egal wieviele Daten.

Das Problem des Abbrechens eine lange dauernden Abfrage bleibt jedoch bestehen.
Das wiederrum ist kein Problem, wenn der Anwender Daten von 1996-heute auswertet, weiß er das dies länger dauert. Mit "Ihre Anwendung reagiert nicht mehr" kann er nichts anfangen. Weiterhin kann man dieses Problem auch serverseitig abfangen, wenn es denn wirklich zu lange dauern sollte und ein Timeout senden. SQL Server bieten auch immer die Möglichkeit eine Abfrage mittels neuem Kommando abzubrechen.

Letztendlich kann ja sogar das Drucken "hängen", wenn der Printserver nicht richtig will. Da alles dies zentral über Klassen gesteuert werden kann, wenn es denn so Designed ist, weiß man die "3" Stellen, wo es dazu kommen kann. Daher könnte man dort eine entsprechende Struktur schaffen - zB ein 2. Thread welcher die Dauer mist und dann zB abbricht. Als Entwickler weiß ich natürlich nie, auf welche Ideen der Anwender kommt und kann somit auch nicht an jeder Stelle ein Multithread modell implementieren.

Hinzu kommt, das manche Unternehmen in der letzten Ecke ein "Pentium 133" stehen haben, der dann plötzlich für Lagerbuchungen wiederentdeckt wurde. Schaut der sich dann die letzten 100 Lagerbewegungen am, dauert es > 5 Sekunden und es kommt "Software geht nicht richtig"

Ich hätte erwartet, man kann zB über eine Nachricht (Postmessage and das BS) mitteilen, das alles iO ist und es noch etwas dauert (mehr als 5 Sekunden).

Aber angenommen man hat alles in Threads, wie verfährt man dann, wenn ich nicht will, das der Anwender etwas machen kann und auch nicht weiß, wie die Anwendung gerade ausschaut (welche Forms offen sind etc). Prinzipiell hätte ich gedacht, man Disabled alle Forms, was aber wiederrum auch nicht "blind" geht, da das unter umständen modale Fensterzustände zerschiesst.

Vereinfachter "WüßtCode" als Bsp:
Delphi-Quellcode:
...
TMyQuery.Refresh;override;

procedure TMyQuery.Refresh;
begin
 ApplicationController.CriticalSection.Enter;//Anwender muß auf Ergebnis warten, kein 2. mal hier hinein.
 ApplicationController.FormManager.DisableAllForms;
 Connection:=ConnectionPool.GetConnection;
  Self.DisableControls;//TDataSet
   T:=TThread.CreateAnonymousThread(
   procedure
    begin
     inherited;
    end);
   T.Start;
  ApplicationController.WaitForThread(T);
  EnableControls;
 ApplicationController.FormManager.EnableAllForms;
 ApplicationController.CriticalSection.Release;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 23:10
Wobei du dir mit CriticalSetion.Enter gleich die nächste Blockade eingebaut hättest.

Kannst du nicht einfach ein modales Fenster anzeigen, damit der Anwender sieht was passiert? Das wird dann beendet, wenn der Thread zurückkommt oder der Benutzer bricht die Aktion - wie auch immer - ab. Mach dann noch eine Verzögerung rein, damit das Fenster bei kurzen Abfragen nicht immer aufflackert.

Ohne den Thread würden bei einem Refresh ja auch keine Eingaben verarbeitet. Insofern bringt das modale Fenster keinen Nachteil.

Ist nur so aus dem Ärmel.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#13

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 23:19
Man kann das Formular auch aktiv lassen und bei einer Korrektur der Filter/Sucheinstellungen einfach die alte Abfrage abbrechen und eine neue laden.
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#14

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 18. Feb 2013, 02:07
@Uwe - das ist auf jeden Fall auch noch einmal eine Idee.

Mich wundert es einfach nur, das es für diesen wirklichen absoluten Standardfall einfach kein standard- (getestetes) und empfohlenes Designmuster mit Standardkomponenten gibt, ohne das alles komplett selbst gebaut werden muß. Insb. da ja alles und jeder die Standardkomponenten zur Datenbankentwicklung verwendet (*der Vorteil* von Delphi)

Das Problem sieht man ja bereits in der QualityCentraal Anwedung von EMB selbst, wenn man mal versucht zB 1000 Datensätze auszuwerten. (Anhang) gekrönt von einer Fehlermeldung, die es mir als Anwender unmöglich macht ältere Bugreoprts zu lesen?! (klar kann ich als Anwender jetzt wieder Datumsbereiche aufschreiben und per hand durchgehen, das akueptiert aber kein "normaler Mensch")
Miniaturansicht angehängter Grafiken
18-02-2013-01-47-13.jpg  
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#15

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 18. Feb 2013, 07:41
Mich wundert es einfach nur, das es für diesen wirklichen absoluten Standardfall einfach kein standard- (getestetes) und empfohlenes Designmuster mit Standardkomponenten gibt, ohne das alles komplett selbst gebaut werden muß. Insb. da ja alles und jeder die Standardkomponenten zur Datenbankentwicklung verwendet (*der Vorteil* von Delphi)
Jetzt, wo Du es sagst... Die Sanduhr ärgert mich eigentlich auch schon seit Jahren. Allerdings ist die Lösung vielleicht auch so dermaßen einfach, das niemand auf die Idee gekommen ist, einen Thread als Komponente zu verwenden (so gut wie niemand).

Aber das jeder die Standardkomponenten zur Datenbankentwicklung verwendet, stimmt imho so nicht, es wird eher mit Zeos, UniDac, AnyDAC etc. entwickelt. Und es herrscht die weit verbreitete Meinung, das datensensitive Steuerelemente mehr Sorgen als Nutzen bringen (wenn man sie zum Editieren verwendet).
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#16

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 18. Feb 2013, 11:15
[QUOTE=Furtbichler;1204073]
Aber das jeder die Standardkomponenten zur Datenbankentwicklung verwendet, stimmt imho so nicht, es wird eher mit Zeos, UniDac, AnyDAC etc. entwickelt. Und es herrscht die weit verbreitete Meinung, das datensensitive Steuerelemente mehr Sorgen als Nutzen bringen (wenn man sie zum Editieren verwendet).
THIS!

Insgesamt ist es allerdings eine schmerzhafte Erfahrung das wir Datensensitive Komponenten einsetzen, aber damals haben wir an RAD geglaubt....das führt dann auch immer zu FatClients und die sind im Netzwerk generell nicht so toll.
In Neuen Anwendungen benutzen wir solche Dantenbanksensitiven Oberflächen Komponenten nur noch mit bedacht oder gar nicht. Wir setzen mittlerweile auf eine Lösung mit einem Applicationserver mit der Businesslogik und mittelschwere Netzwerkclients, da haben wir dann alles in der Hand.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#17

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 18. Feb 2013, 11:50
hm also das kann ich nicht bestätigen, muß ich sagen.

natürlich baut man eine anwendung so, das man eine vernünftige architektur hat. unsere clients sind "so doof", das sie selbst nicht mal eine positionssumme einer rechnung berechnen können, das läuft alles serverseitig oder über zwischenschichten (nicht delphi )

von den datensensitiven komponenten bin ich eigentlich sehr überzeugt, das funktioniert auch fantastisch, insb. mit devart, welches mit einigen gut gesetzten properties auch super sql statements formuliert. aber lassen wir mal diese glaubensdiskussion aussen vor.

letztendlich ist ja die frage, wir designe ich eine applikation welche potentielle "hangs" verursacht so, das ich möglichst zentral diese problematik aus wenigen klassen heraus abfangen kann. mit multithread und disable/enable forms sind wir gleich wieder darauf hereingefallen, das zB zyklische hintergrundthreads die modalstati zerschossen haben.

Bsp:

Anwender drückt button "löschen" -> modal
Backgroundthread -> DisableForms -> Refresh (dataset, indy, datasnap) -> EnableForms.

Das TForm.Enabled zerlegt den Modalstatus und der Anwender kann plötzlich weiterarbeiten, woanders hinklicken, ohne die frage zu beantworten. sicher kann man auch dies wieder abfangen, nur wie gesagt - mich wundert das es kein standard entwurfsmuster in delphi für solche fälle gibt. bei uns ist das problem jetzt nicht wirklich eines, es läuft alles gut und die 3 anwender mit isdn verbindung (oder umts zb auf bautstellen) schulen wir schon so, das diese wissen woran sie sind, aber es muß doch mal ein vernünftiges entwurfsmuster geben, welches sich mit den eigenheiten der oberfläche / vcl bewährt hat.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:49 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