offene SQL Results

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

offene SQL Results

Beitrag von Manfred »

Gestern bin ich auf eine Situation gestossen, die mir Probleme bereitet. Ich fordere ein Result (Livecursor) vom ADS an. Danach ist eine Reihe von Arbeiten dran und dann wird das Result wieder gschlossen. So weit so gut. Leider ist der Vorgang aber mittendrin abgebrochen worden, weil es einen Fehler im Programm gab. Der Client wurde wieder auf die index.html Seite geworfen, aber das Result war noch offen. Beim nächsten Vorgang kam dann die Meldung beim Schreiben, das der Satz noch von einem anderen User gesperrt wäre. Das ist schon blöd weil es ja immer wieder mal vorkommen kann. Wie löst man so Absturzprobleme? Irgendwie muß ja das Result wieder geschlossen werden. Der ADS hat ja seine Verbindung über xb2net noch zum Programm, was ja weiter läuft. Nur der Client im Web ist ja draußen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Wie löst man so Absturzprobleme?
a) Dadurch, dass man solche möglicherweise kritischen Prozesse (also den, der den Fehler ausgelöst hat) in Sequenzen einbettet und im Fehlerfall entsprechend agiert.
b) Durch Timeouts auf der Serverseite.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

zu b) einen Timeout gibt es, aber der greift ja nicht nach Sekunden(wäre ja auch sicherlich zu kurz gedacht). Und der User meldet sich ja sofort wieder an und kommt dann in erneut besagte Situation, weil er ja ab da auch als Fremdling gilt, der einen gesperrten Satz anpacken will. (Zumindest ist das in der Situation der Fall)
zu a) könntest Du mir da näheres zu schreiben? Ich habe im Moment keine Idee, wie Du das umsetzen würdest.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: offene SQL Results

Beitrag von HaPe »

Hallo Manfred !
zu a) könntest Du mir da näheres zu schreiben? Ich habe im Moment keine Idee, wie Du das umsetzen würdest.
Indem du an allen kritischen Stellen immer auf korrekte Rückgabewerte prüfst und ist das nicht der Fall, die Connection zum ADS ordnungsgemäß schließt und die Funktion beendest.
--
Hans-Peter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

HaPe, Manfred spricht von einem Fehler, also einem Laufzeitfehler. Im einfachsten Fall sichert man das Fehlerobjekt, bettet die gesamte Routine, in der dieser Fehler geschehen kann, in eine Sequenz, und ergänzt das Break() im ersetzten Fehlerobjekt durch das Schließen der Verbindung.

Code: Alles auswählen

FUNCTION HierSpielDieMusik() // das ist die Auswertungsroutine, in der der Fehler auftreten kann
LOCAL bError := ErrorBlock( {|o|MsgBox(o:Description),CloseConnection(),Break(o)})
BEGIN SEQUENCE
* Musik spielen
ENDSEQUENCE
ErrorBock(bError)
RETURN Result
Die MsgBox soll nur verdeutlichen, dass man den Fehler auch tracken kann, selbst in einer Serversituation. "CloseConnection" ist abstrakt - hier sollte dann also die Verbindung geschlossen werden.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

Hi Tom,
stimmt. Ich vergesse immer wieder, das man sowas ja auch in xb2net programmieren kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Ich vergesse immer wieder, das man sowas ja auch in xb2net programmieren kann.
Das ist gerade bei Serverprogrammierung ziemlich wichtig. Du hast ja keinen Benutzer, der davorsitzt, und neben der Fehlervermeidung und -analyse ist extrem wichtig, dass der Server läuft und erreichbar ist. Falls es um eine Art Server gehen sollte. Ansonsten sollte natürlich auch bei einem Frontend in der ErrorSys dafür gesorgt werden, dass ggf. offene Connections geschlossen, Semaphoren freigegeben oder gelöscht usw. werden.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

naja, das Dingen dabei ist, der Server läuft weiter nur der Client wird rausgeworfen. Ich muß das alles mal ordentlich verfeinern.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Ich nehme an, der Workerthread wird einfach beendet. In Xb2.Net sind alle Serverklassen auch von Thread() abgeleitet, und im Fehlerfall beenden sie sich einfach. Falls Du das so verwendest, kannst Du das Schließen der Verbindung auch dort einbauen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

ok, das wäre das gewesen, worauf ich hier als Antwort gehofft habe. Aber leider fehlt mir da noch Wissen, wie man sowas angeht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: offene SQL Results

Beitrag von georg »

Hallo, Manfred -


dann schaue Dir mal die Methode :atEnd() sowie die iVar :atEnd der Thread()-Klasse an, das ist wahrscheinlich der Ansatzpunkt, den Du suchst.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Nein, es ist der :onError-Slot. Einfach da das Schließen der Connections (u.a.) reinpacken.
Herzlich,
Tom
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: offene SQL Results

Beitrag von HaPe »

Hallo Tom !
HaPe, Manfred spricht von einem Fehler, also einem Laufzeitfehler.
... rettet die gesamte Routine, in der dieser Fehler geschehen kann, in eine Sequenz, und ergänzt das Break() im ersetzten Fehlerobjekt durch das Schließen der Verbindung.
Mir war nicht klar, das in Xbase++ das try/catch aus C/C++/C#/VFP/Java/Python/Matlab/PowerShell/... mittels Sequenz umgesetzt wird.
Sonst hätte ich das dazugeschrieben, weil ich try/catch in Xbase++ nicht gefunden habe.
--
Hans-Peter
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

Tom hat geschrieben: Mi, 02. Mär 2022 12:12 Nein, es ist der :onError-Slot. Einfach da das Schließen der Connections (u.a.) reinpacken.
aber das result wird doch in eine Local var geschrieben. Wie komme ich dann da dran?. Und Connection wäre doch die komplette Verbindung des webServers zum SQl Server? Die will ich ja nicht schließen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Ich arbeite mit dem ADS nicht auf diese Weise (das mache ich mit Postgre), deshalb kann ich Dir nicht genau sagen, was zu tun wäre, um die Sperrung aufzuheben, aber die Strategie wäre halt, im Fehlerfall entsprechend zu reagieren. Tatsächlich nutzen wir bei aktiver ADSDBE im Xb2.Net-Server auch eine eigene Session je Verbindung von außen (also im jeweiligen Serverthread findet ein Connect statt), die bei Beendigung und/oder im Fehlerfall geschlossen wird (während wir in der Hauptanwendung nur eine Session für alles nutzen, die an alle Threads per SetDefault sozusagen vererbt wird).
Herzlich,
Tom
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Marcus Herz »

Hallo Manfred
Da du das wahrscheinlich mit AdsClass machst, du musst die Connection der SQL Verbindung schliessen, nicht die Connection zum Server als solche:

Code: Alles auswählen

// mit Dictionary

oResultset 	:= addDic:OpenSqlTable("select * from kunde" )
if isObject(oResultset)
	begin sequence
	// verarbeitung
	
	end sequence
	oResultset:close()		// gibt ADS Server und Client Speicher frei !!
endif
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Marcus Herz »

Tom schrieb:
auch eine eigene Session je Verbindung
Unbedingt.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

Hi Marcus
das ist m.E. nicht das Problem. Das mache ich ja. es geht darum wenn ich nicht an das :close komme, sondern vorher der Client "stirbt"
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Marcus Herz »

Wie kann der Client sterben, bevor du deine Verarbeitung beendest hat
Ich mache für jeden Request die Datenbanken auf und schliesse alles wieder bevor ich die HTML Seite zurückschicke.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: offene SQL Results

Beitrag von Manfred »

ganz einfach, irgendwo im Ablauf des Codes ist ein unerkannter Fehler. Dann wirft der Webserver den Client raus und er steht im Loginbildschirm, wie schon oben erklärt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: offene SQL Results

Beitrag von Tom »

Das sind jetzt aber zwei Dinge gleichzeitig.

Es gibt einen Fehler und der Server reagiert darauf mit dem Anmeldedialog (weil der vermutlich bei "onGet" oder als "IndexFile" angegeben ist - und ein verkehrter Request reinkommt). Du kannst aber auch im Fehlerfall dem Benutzer irgendwas anzeigen ("onError" kann z.B. auch HTML senden). Das ist aber nicht die Frage, die Du oben gestellt hast. Da hast Du nach einem verbliebenen Lock gefragt, nach einer noch offenen Session.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: offene SQL Results

Beitrag von AUGE_OHR »

hi HaPe,
HaPe hat geschrieben: Mi, 02. Mär 2022 12:57 weil ich try/catch in Xbase++ nicht gefunden habe.
wie wäre das

Code: Alles auswählen

#xcommand TRY              => BEGIN SEQUENCE          
#xcommand CATCH [<oErr>]   => RECOVER [USING <oErr>]
gruss by OHR
Jimmy
Antworten