AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken DataSnap Client connection über FireDAC
Thema durchsuchen
Ansicht
Themen-Optionen

DataSnap Client connection über FireDAC

Ein Thema von Kostas · begonnen am 22. Aug 2014 · letzter Beitrag vom 23. Aug 2014
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

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

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 14:56
Wir nutzen DataSnap ebenfalls. Abbrechende Verbindungen verwalten wir selbst. Sprich wir haben einen Wrapper um die Clientmethoden, die die Verbindung wieder aufbauen, wenn der Aufruf durch einen Verbindungsabbruch fehlschlägt.

Der Transfer von Datasets über FireDACJSONReflect funktioniert sehr gut und ist gerade bei vielen kleinen Datenbanktabellen um ein vielfaches schneller als vorher via DBX. Ich hoffe, dass da noch mehr kommt, aber gut nutzbar ist das auf jeden Fall.

Da serverseitig eigene Sessions auch das Datenbankhandling übernehmen, ist auch dort ein Verbindungsabbruch kein Problem solange die Session beim Reconnect noch da ist. Da man bei FireDACJSONReflect die Verbindung zwischen den Komponenten selbst regelt, macht DataSnap da auch keinen Strich durch die Rechnung wie leider an manchen anderen Stellen.

Wichtig beim Reconnect:
Die Clientmethoden-Klasse muss neu erstellt werden, ansonsten funktioniert diese danach nicht mehr...
Vielleicht ist das das Problem gewesen, auf das du gestoßen warst.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 15:10
Erganzend dazu: Der ClientCallbackManager braucht einen kleinen Patch, damit er nach einem Verbindungsabbruch wieder funktioniert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#3

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 15:23
Danke Sebastian für den Hinweis.

Ich fange jetzt wirklich frisch an und versuche mich durch die Tuts und Dokus.
Dein Hinweis kann ich noch nicht werten, ich bin noch nicht so weit.
Möglicherweise meinst du das:

Aus den aktuellen Tut: http://docwiki.embarcadero.com/RADSt...Base-Tutorial)
Delphi-Quellcode:
procedure TfrClientMain.Button3Click(Sender: TObject);
var
  myServer: TUn_ServerModuleClient;
  von,bis: TDateTime;
begin
  SQLConnection1.Open;

  myServer := TUn_ServerModuleClient.Create(SQLConnection1.DBXConnection);
  try
    Label1.Caption := myServer.callStoredProcedureAuswertung(StrToDateTime(Edit1.Text),StrToDateTime(Edit2.Text));
  finally
    if SQLConnection1.Connected
    then SQLConnection1.close;
    myServer.free;
  end;

end;
Meinst du das die Instanz von "myServer" nach einem Abbruch neu erzeugt werden soll?
In diesem Fall wäre das recht einfach. Ich nutze hier eine Methode "callStoredProcedureAuswertung" die der DataSnapServer bereitstellt. Es ist aber
auch so dass der Client DataSets konsumiert die über DataSetProvider-ClientDataSet
bereitgestellt werden. Auf der Form gibt es auch eine DSProviderConnection dessen Connection
ich zumindest zur Designtime nicht disconnecten kann.

Sorry für die unqualifizierte Beschreibung, wie gesagt, ich fange wieder frisch an.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 20:25
Meinst du das die Instanz von "myServer" nach einem Abbruch neu erzeugt werden soll?
Ja, genau.

Erganzend dazu: Der ClientCallbackManager braucht einen kleinen Patch, damit er nach einem Verbindungsabbruch wieder funktioniert.
Welchen meinst du?

Callbacks habe ich zumindest aus Thin Clients durch erneute Verbindungsversuche wiederherstellen können ohne dass ich etwas geändert hätte.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 23:20
Erganzend dazu: Der ClientCallbackManager braucht einen kleinen Patch, damit er nach einem Verbindungsabbruch wieder funktioniert.
Welchen meinst du?

Callbacks habe ich zumindest aus Thin Clients durch erneute Verbindungsversuche wiederherstellen können ohne dass ich etwas geändert hätte.
Den Patch brauchte ich in einer XE3 App und ich habe es unter XE6 noch nicht wieder probiert, denke aber es ist dort immer noch so.

Kurz: Bei verbundenem Client den Server neu starten. Nun funktionieren die Callbacks nicht mehr und der Client kann die auch nicht mehr registrieren. Das lässt sich nur mit einem Neustart des Clients beheben (genauer mit dem Neuerzeugen des CallbackManagers).

Lang: In TDSClientCallbackChannelManager.CloseClientChannel wird das interne Feld FStopped gesetzt, wenn der Server die Verbindung beendet. Dabei werden aber die Callbacks nicht freigegeben. Ruft man dann TDSClientCallbackChannelManager.CloseClientChannel auf, ist der ExcuteRemote-Aufruf zum einen vollkommen überflüssig (die Verbindung ist ja definitiv weg) und läuft zum anderen in einen Timeout (kostet unnütz Zeit). Das nachfolgende FLocalCallbackRepo.Clear und das Anpassen der Statevariablen wird nicht mehr aufgerufen. Die Callbacks bleiben also im Dictionary und man kann Sie somit nicht mehr neu anlegen (RegisterCallback sieht, die sind schon da und gibt false zurück). Die alten Callbacks funktionieren aber nicht mehr, weil sie beim Server nicht mehr registriert sind (der wurde ja neu gestartet).

Der Patch besteht im Wesentlichen darin, bei FStopped das ExecuteRemote zu überspringen und trotzdem das FLocalCallbackRepo.Clear aufzurufen. Bei XE3 liegt der Code in Datasnap.DSHTTPCommon und bei XE6 in Datasnap.DSCommon.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: DataSnap Client connection über FireDAC

  Alt 23. Aug 2014, 04:55
FStopped finde ich nicht, ich vermute du meinst State auf Stopped? Das Problem ist dann aber klar, ja.
Der Code in CloseClientChannel sieht in XE3 und XE6 identisch aus.

Jetzt wo du es sagst, kann ich mich auch erinnern, dass ich an der Stelle schon einmal ein Problem hatte, ich hatte es mir nur nicht genauer angeschaut.

Gibt es dazu schon einen QC Eintrag? Ich konnte nämlich eben bei einer schnellen Suche keinen finden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DataSnap Client connection über FireDAC

  Alt 23. Aug 2014, 08:15
FStopped finde ich nicht, ich vermute du meinst State auf Stopped?
FStopped ist ein Feld von TDSClientCallbackChannelManager und wird in NotifyChange gesetzt. Da es strict private ist, lässt sich das leider auch nicht mit einer abgeleiteten Klasse fixen.

Der Code in CloseClientChannel sieht in XE3 und XE6 identisch aus.
Bis auf die Tatsache, daß in XE3 die lokale Variable Status nicht initialisiert wird und damit einen unbestimmten Wert enthält wenn State <> ctsStarted ist. In XE6 wird sie mit False vorbelegt, was meiner Meinung nach ungünstig ist, aber das ist vielleicht auch Geschmackssache. Ich finde es intuitiver, wenn auch bei State <> ctsStarted ein CloseClientChannel mit true durchläuft und der State hinterher auf ctsStopped steht, insbesondere wenn der State vorher auf ctsFailed stand. Wichtig ist aber, daß Status bei FStopped auf True gesetzt wird, damit auch aufgeräumt wird.

Das Problem ist dann aber klar, ja.Gibt es dazu schon einen QC Eintrag? Ich konnte nämlich eben bei einer schnellen Suche keinen finden.
Ich muss zu meiner Schande gestehen, daß ich es versäumt habe, einen simplen Testfall aufzubereiten. Takahashi san ist da bekannterweise etwas anspruchsvoll. Ich gelobe aber Besserung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#8

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 15:23
Erganzend dazu: Der ClientCallbackManager braucht einen kleinen Patch, damit er nach einem Verbindungsabbruch wieder funktioniert.
Das ist doch sehr interessant. Danke für den Hinweis Uwe.
  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 23:02 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