![]() |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Hmm..
Hab noch kein Webmodul erstellt, also in blaue... Wenn dein getNothing( in seinem eignen Thread aufgerufen wird, dann muss immer das CoInitialize und das CoUninitialize im getNothing( gemacht werden, sprich da , wo mit den ADOs gearbeitet wird! Jeder Thread muss sein eigenes CoInitialize machen, deshalb geht das (globale) CoInitialize im Initialization nicht. |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Mein praktische Erfahrung mit dutzenden von ISAPI-Dlls ist bisher: Es geht nur, wenn es so
Delphi-Quellcode:
gemacht wurde und in der DPR die erste Zeile hinter dem begin
initialization
CoInitialize(nil); finalization CoUninitialize; end.
Delphi-Quellcode:
lautet.
CoInitFlags := COINIT_MULTITHREADED;
Habe jedenfalls in meinem Fundus keine funktionierende ISAPI-Dll bzw. kein funktionierendes CGI-Programm, die/das ADO nutzt und der Aufruf anders geregelt ist. |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Zitat:
Zitat:
|
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Hallo,
erstmal danke für die zahlreichen Antworten, ich war am Wochenende leider nicht da. Also das Flag wurde gesetzt (CoInitFlags := COINIT_MULTITHREADED) in der ersten Zeile unterhalb von 'begin' in der der dpr. Weiterhin wurde CoInitialize(nil) und CoUninitialize nochmals in 'initialization' & 'finalization' eingefügt. Starte ich den Service nun, wirft er mir bei der Nutzung der ADO eine Exception das CoInitialize nicht verwendet wurde. Das Speicherüberlauf-Problem ist leider immer noch vorhanden, an der rohen TWebModule Instanz kann es nicht liegen, lasse ich (testweise) die Verbindung zur DB sein und kommentiere diese aus, dann kann ich locker 2000 Anfragen in ein paar Sekunden stellen ohne das der Arbeitsspeicher auch nur mit der Wimper zuckt. Demnach muss es irgendwas mit der ADO Connection zu tun haben. Ich würde ja auch eine andere DB Verbindungsart testen, weis aber ehrlich gesagt bei einer MaxDB (SAP) nicht was ich sonst für eine Verbindung nutzen kann, zumal ich bisher mit der ADOConnection sehr gut gefahren bin. @nahpets: wenn ich weitere Instanzen des Clients starte (auf der selben Maschine) dann wird keine neue Verbindung erstellt, ich denke mal du wirst recht haben mit den zwei Verbindungen. Habe ich drei bis vier Instanzen offen bekomme ich auch Exceptions das dass Datenbankobjekt mehrfach genutzt wird, demnach stimmt die Theorie soweit das er pro IP/Client ein WebModule erstellt da ja in diesem Fall mehrere Clients ein WebModule "genutzt" haben. |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Zitat:
CoInitialize(nil) und CoUninitialize dürfen nur einmalig aufgerufen werden. Nicht pro Verbindung und nicht pro Client und nicht pro Anfrage, sondern insgesamt nur einmal. Bei 'ner ISAPI-Dll ist das durch den Aufruf in initialization und finalization sichergestellt. Weiß nicht, ob das bei 'nem Service auch so ist, würd' es aber doch stark vermuten. Schlimmstenfalls mal bei jedem Aufruf der beiden Routinen 'nen Eintrag in 'ne Logdatei machen, um so zu prüfen, wie oft man da vorbeikommt. Alternative:
Delphi-Quellcode:
Ich vermute mal, dass CoInitialize da nicht so ganz threadsave ist, da die Aufrufe ja allem Anschein nach weitere Verbindungen irgendwie beeinflussen.
begin
CoInitFlags := COINIT_MULTITHREADED; CoInitialize(nil); Application.Initialize; Application.CreateForm(Application.CreateForm(Twm, wm); Application.Run; CoUninitialize; end. Wenn alle Stricke reißen, dann mal die ganze Verbindung von CoInitialize über Verbindung zur Datenbank und Ausführung der Abfrage, bis CoUninitialize mit 'ner TCriticalSection kapseln. Allerdings scheint mir das dann nicht so wirklich im Sinne des Erfinders zu sein. Eventuell findest Du hier ja weitere Hinweise: ![]() Hab' mal die Sourcen einer funktionierenden ISAPI-Dll angehängt, eventuell kannst Du damit ja was anfangen. |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Zitat:
|
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
"Nochmals" war schon richtig, hatte die Idee mit der initialization / finalization bereits probiert, leider funktioniert es dort nicht.
Werde es jetzt nochmal direkt in der .dpr testen, sprich den von dir geschilderten Ablauf, andernfalls werde ich mir die .dll mal zu gemüte führen, schon mal ein riesen Danke im voraus !!! :) An dem "drumherum" kann es nicht liegen da es ohne die ADOConnection problemlos läuft und kein Arbeitsspeicherüberlauf eintritt, das ist ja das verwunderliche, zumal ich die ADOConnection so gut wie immer verwende und das immer in diesem Service-Template (man tippt ja ungern doppelt :-P), nur eben zum ersten mal mit einem WebModule :shock: Werde mich dann mit weiteren Infos melden wenn es Neuigkeiten gibt. Danke für eure Hilfe bis jetzt :thumb::wink: |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Alternative:
Delphi-Quellcode:
Funktioniert so leider auch nicht. Bekomme dann die Exception das CoInitialize nicht aufgerufen wurde.
begin
CoInitFlags := COINIT_MULTITHREADED; CoInitialize(nil); Application.Initialize; Application.CreateForm(Application.CreateForm(Twm, wm); //Initialisierungen hier zwischen... Application.Run; CoUninitialize; end. Die Initialisierung des Webmodules erfolgt in der .dpr:
Code:
program TCMWebservice;
uses ActiveX, System.Win.ComObj, Vcl.SvcMgr, SysUtils, StrUtils, Web.WebReq, IdHTTPWebBrokerBridge, srvMain in 'srvMain.pas' {GFSRestWebservice: TService}, serviceConsts in 'serviceConsts.pas', ModDb in 'modules\ModDb.pas' {DataModule1: TDataModule}, ModWebModule in 'modules\ModWebModule.pas' {WebModuleMain: TWebModule}, ModSessionHandler in 'modules\ModSessionHandler.pas' {SessionHandler: TDataModule}; {$R *.RES} var sName : String; DBConInit : TDataModule1; begin if not Application.DelayInitialize or Application.Installing then Application.Initialize; if WebRequestHandler <> nil then begin WebRequestHandler.WebModuleClass := WebModuleClass; end; Application.CreateForm(TTCMRestWebservice, TCMRestWebservice); Application.CreateForm(TSessionHandler, SessionHandler); try sName := ExtractFileName (ParamStr (0)); sName := AnsiReplaceText (sName, ExtractFileExt (sName), ''); TCMRestWebservice.Name := sName; TCMRestWebservice.DisplayName := sName; sName := EmptyStr; Application.Run; except on E: Exception do end; end. |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Momentan hab' ich da keine Idee mehr, nur was zum Lesen:
![]() ![]() ![]() Ob dort eine Lösung zu finden ist, vermag ich nicht zu sagen. Edit: Was mir da gerade noch so einfällt: Statt ADO die ![]() |
AW: WebModule & ADOConnection in Service -> Speicherübrelauf
Okay werd ich mir direkt mal anschauen ! Danke für die Infos und die Hilfe :thumb:
Sobald es neues gibt werde ich mich hier melden :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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