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 1 von 2  1 2      
DSCHUCH

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

Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 17:32
Hallo,

wie würdet Ihr folgendes Problem designen:

Verwendung von Standardkomponenten in Delphi.

=> DBGrid, DBNavigator, Query.

---

Der Nutzer hat im DBNavigator die Möglichkeit, Query.Refresh zu drücken. Dabei ist unbekannt, wie lange das Query dauert. Nehmen wir mal an >5 Sekunden (zB Anbindung über DSL), somit kommt von Windows "diese Anwendung reagiert nicht mehr".

---

Ich möchte dabei keinerlei Logik in der Form haben, da dies ja an jeder Stelle der Software, wo es einen DB-Navigator gibt, genauso passieren kann.

---

Grundsätzlich hätte ich jetzt überlegt beispielsweise mein Query abzuleiten und im "BeforeRefresh" eine Thread zu starten und im "AfterRefresh" zu stoppen. In diesem sagt man der Anwendung (bzw Windows) "warten auf query, alles iO", wodurch die Meldung von Windows "Anwendung reagiert nicht mehr" verhindert wird.
Für diesen Ansatz scheint es aber keinerlei technische Möglichkeit zur Umsetzung zu geben, ist das richtig?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:00
Delphi ist ganz klar auf eine 2-Tier-Architektur aufgelegt.
Hier die Anwendung, dort der Datenbankserver.
Alle Methodenaufrufe sind synchron, d.h. blockierend.
(Ich verallgemeinere hier jetzt etwas, aber das sind ganz grob die Eigenschaften von Delphi)
Wenn man das ändern möchte, müsste asynchrone Funktionen in Delphi einführen oder andere Klimmzüge ausführen die einem das Leben als Programmierer vermiesen.
Ausserdem müssten die Datenbanktreiberschichten ebenfalls überarbeitet werden.

Wenn man Tabellen mit vielen Datensätzen anzeigen möchte, muss man einen Filter davorschalten um die Datenmenge einzuschränken.
Der Benutzer muss also irgendwelche Einschränkungen (z.B. Datumsbereich) vorgeben, bevor er die Daten zu sehen bekommt.
Bei den ADO-Komponenten kann man bei manchen Servern (eigentlich nur MS SQL-Server) die CursorLocation auf clUseServer stellen.
Dann kehrt die Abfrage relativ schnell mit Daten zurück, aber das Scrollen im DBGrid wird dafür sehr langsam (weil im Hintergrund Daten nachgeladen werden).
Ausserdem wird der Server ziemlich stark beansprucht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:10
Bei den ADO-Komponenten kann man bei manchen Servern (eigentlich nur MS SQL-Server) die CursorLocation auf clUseServer stellen.
Dann kehrt die Abfrage relativ schnell mit Daten zurück, aber das Scrollen im DBGrid wird dafür sehr langsam (weil im Hintergrund Daten nachgeladen werden).
Ausserdem wird der Server ziemlich stark beansprucht.
Das geht auch bei anderen DBMS (z.B. DB2).

Bei ADO gibt es aber auch noch die asynchrone Verarbeitung.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
DSCHUCH

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

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:17
das unterstützen eigentlich viele datenbanken => cursor fetch.

die anwendung soll ja wegen mir im einfachsten fall auch blockiert sein, der nutzer wartet auf daten. aber es muß doch irgendwie möglich sein, dass diese nicht "frozen" ist (und man zB funktionen wie serverseitiges beenden der abfrage über eine 2. connection ermöglicht), ohne die komplette struktur per hand zu implementieren (da man dann ja zB sämtlichen DB-Sensitiven elemente wegwerfen kann, die datenbank operationen anstossen). gerade mit internet, cloud etc.

ps - ich kann mir nicht vorstellen, das jede plunder app auf meinem telefon multithreaded ist, während der cursor kreist, nur weil evtl gerade meine internetverbindung langsam ist, damit nicht kommt "anwendung reagiert nicht mehr".

Scheint ja zB Android ebenso zu machen: http://www.rikomagic-forum.de/board2...eagiert-nicht/

Geändert von DSCHUCH (17. Feb 2013 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:27
Das generelle Problem ist die Tatsache, das die anzuzeigenden Daten offensichtlich übertragen werden müssen. Müssen sie? Mehr als 100 Datensätze sieht man eh nicht auf einmal.

Ich würde einen Paging-Mechanismus implementieren oder entsprechende Komponenten (DevExpress, ServerMode) einsetzen.

Sorgt einfach dafür, das die Sanduhr beim Anzeigen von Daten nicht kommen muss. Es ist für einen Server im Mehrbenutzerbetrieb auch nicht gerade prickelnd, irgendwelche Gigabytes zu schaufeln, die sich eh keiner anschaut. Der geht überflüssigerweise in die Knie.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:33
Hallo,

Telefon-Apps benutzen idR Webservices, um die Daten zu Laden.
Das Threading läuft also dort wohl auf der Middle-Tier Serverseite.


Heiko
Heiko

Geändert von hoika (17. Feb 2013 um 19:15 Uhr)
  Mit Zitat antworten Zitat
DSCHUCH

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

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 18:47
Wo ich gerade schon mal über Delphi-Referenz durchsuchenTClientDataSet gesprochen habe ...

Abfrage im Thread laufen lassen und das Ergebnis in einem TClientDataSet zur Verfügung stellen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
DSCHUCH

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

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 19:03
nehmen wir mal ein einfaches post an, was gerade hängt. ausgelöst durch db edit. oder halt applyupdates, what ever. es gibt tausende möglichkeiten, wann eine netzwerkanwendung hängen kann, insb. bei langsamen netzwerken. und das sind auch stellen, wo manchmal nur ein einziger datensatz ausgetauscht wird.

also gibt es hier wirklich keine möglichkeit die anwendung für windows "am leben" zu halten?

letztendlich kann ja bereits ein einfaches TIdHTTP.Post; "hängen..." (wobei ich jetzt nicht mehr weiß, ob das durch "idAntiFreeze", oder wie das hieß, aufgehoben wird.)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Anwendungsdesign: Datenbankanwendung, Refresh.

  Alt 17. Feb 2013, 19:13
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. 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.

Und Paging übers Netz ist ja auch kein Problem. Und DAS ist keine Programmierung extra für eine langsame Verbindung, sondern eine nachhaltige. Meine Meinung. Aber gut, Du scheinst bedauernswerterweise suboptimale Software vorgefunden zu haben und musst nun damit umgehen (kenn ich doch irgendwoher).

Aber wenn es denn nun mal ganz ohne Anpassung gehen muss, dann hilft nur ein Thread. Das Problem des Abbrechens eine lange dauernden Abfrage bleibt jedoch bestehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:10 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