AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke WebModule & ADOConnection in Service -> Speicherübrelauf

WebModule & ADOConnection in Service -> Speicherübrelauf

Ein Thema von markusef · begonnen am 13. Jan 2017 · letzter Beitrag vom 19. Jan 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 11:48
oder nur?

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:
begin
  CoInitFlags := COINIT_MULTITHREADED;
  CoInitialize(nil);
  Application.Initialize;
  Application.CreateForm(Application.CreateForm(Twm, wm);
  Application.Run;
  CoUninitialize;
end.
Ich vermute mal, dass CoInitialize da nicht so ganz threadsave ist, da die Aufrufe ja allem Anschein nach weitere Verbindungen irgendwie beeinflussen.

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: https://www.benefind.de/web.php?org=...+thread+delphi

Hab' mal die Sourcen einer funktionierenden ISAPI-Dll angehängt, eventuell kannst Du damit ja was anfangen.

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
markusef

Registriert seit: 9. Mai 2016
15 Beiträge
 
Delphi 10 Seattle Professional
 
#2

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 13:24
Alternative:
Delphi-Quellcode:
begin
  CoInitFlags := COINIT_MULTITHREADED;
  CoInitialize(nil);
  Application.Initialize;
  Application.CreateForm(Application.CreateForm(Twm, wm);
  //Initialisierungen hier zwischen...
  Application.Run;
  CoUninitialize;
end.
Funktioniert so leider auch nicht. Bekomme dann die Exception das CoInitialize nicht aufgerufen wurde.

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.
Markus
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 13:44
Momentan hab' ich da keine Idee mehr, nur was zum Lesen: MSDN - CoInitialize function

When do I need to call CoInitialize() in this scenario?

Multithreaded Delphi Database Queries

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 ZeoLib nutzen. Sie kann auch mit ADO umgehen und damit auch über ODBC auf was auch immer zugreifen.

Geändert von nahpets (16. Jan 2017 um 14:07 Uhr) Grund: Text ergänzt
  Mit Zitat antworten Zitat
markusef

Registriert seit: 9. Mai 2016
15 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 14:26
Okay werd ich mir direkt mal anschauen ! Danke für die Infos und die Hilfe
Sobald es neues gibt werde ich mich hier melden
Markus
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#5

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 18:21
Hmm..



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.
Nicht ganz richtig..

Lt.:

https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

MUSS CoInitialize(nil) und CoUninitialize JE Thread aufgerufen werden wenn COM verwendet werden soll, was bei ADO nun mal so ist.

Wenn jede Anfrage über das WebModule in einem eigenen Sub-Thread ausgeführt wird, muss auch in der Execute des Threads CoInitialize(nil) und CoUninitialize aufgerufen werden.

Auch kannst Du mehrfach CoInitialize aufrufen, musst nur jeweils auch ein CoUninitialize dazu machen.

Ob es bei einer ISAPI-Dll anders ist, oder ob diese DLL immer nur aus einem Thread (MainThread) aufgerufen wird.. k.A.

Jedoch deuten die Fehlermeldungen von seinem ADO-Aufruf darauf hin, dass diese in einem eigenen Thread aufgerufen werden und somit expliziert CoInitialize brauchen.
Warscheinlich sind die ADOs eben nicht ThreadSave und somit eventuell von CoInitFlags := COINIT_MULTITHREADED ausgenommen..
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 18:35
Also den Fehler mit dem CoIni ... nicht aufgerufen hab' ich bei den ISAPI-Dlls erst dann wegbekommen wenn ich

1. ISAPIThreadPool in die Uses der DPR
2. CoInitFlags := COINIT_MULTITHREADED hinter das Begin der DPR
3. CoInitialize(nil); ins initialization des Webmoduls
4. CoUninitialize; ins finalization des Webmoduls

gepackt habe.

Und ja, es widerspricht allen Dokumentationen.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#7

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 18:43
Hmm..


Also den Fehler mit dem CoIni ... nicht aufgerufen hab' ich bei den ISAPI-Dlls erst dann wegbekommen wenn ich

1. ISAPIThreadPool in die Uses der DPR
2. CoInitFlags := COINIT_MULTITHREADED hinter das Begin der DPR
3. CoInitialize(nil); ins initialization des Webmoduls
4. CoUninitialize; ins finalization des Webmoduls

gepackt habe.

Und ja, es widerspricht allen Dokumentationen.
OK, dann sollte er mal prüfen, ob er es genau so gemacht hat.
Vielleicht kümmert sich ja die ISAPIThreadPool dann um die COM-Verwaltung ?!?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 16. Jan 2017, 19:48
Das Teil ISAPIThreadPool ist irgendwie dafür verantwortlich, dass das Multithreading in 'nem Webserver mit ISAPI-Dlls überhaupt funktioniert.

Und hier wird im konkreten Fall ja eine Webserver erstellt, der mehrere Anfragen von mehreren Clients zeitgleich verarbeiten können muss.

Eventuell sollte man sich die Unit mal genauer anschauen und prüfen, was dort so alles geschieht, was im zu erstellenden Service (und seinen genutzten Units) nicht vorhanden ist.

CoInitializeEx und CoUninitialize werden in der Unit u. a. auch aufgerufen.
  Mit Zitat antworten Zitat
markusef

Registriert seit: 9. Mai 2016
15 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 17. Jan 2017, 11:17
Neuer Stand:

ich werde das ganze Projekt jetzt doch als .dll für einen IIS aufbauen. Bezüglich der ADO/Webmodule/Service-Geschichte gab es einfach keine Fortschritte und auch (aus meiner Sicht) keine Anhaltspunkte mehr um das ganze Zeitnah zu realisieren.

Mit der .dll unter IIS funktioniert das einwandfrei, danke an der Stelle nochmal an naphets, das war ein super Beispiel zum orientieren !
Ist zwar jetzt ein wenig umständlicher zu handhaben, aber es geht zumindest und das auch sehr performant !

Wenn mal wieder Luft ist werde ich natürlich weiter versuchen das ganze als Service zu realisieren (sowas kann man ja nicht auf sich beruhen lassen ).
Falls euch noch was einfallen sollte, ich werde den Thread dennoch regelmäßig besuchen & updates geben wenn ich an der Problematik weiter getüfftelt habe
Markus
  Mit Zitat antworten Zitat
markusef

Registriert seit: 9. Mai 2016
15 Beiträge
 
Delphi 10 Seattle Professional
 
#10

AW: WebModule & ADOConnection in Service -> Speicherübrelauf

  Alt 19. Jan 2017, 10:36
Also mit der .dll klappt das soweit wunderbar.
Allerdings wächst der Arbeitsspeicher für die w3wp.exe die die isapi dll nutzt pro Anfrage auch ziemlich schnell ins unermessliche. Nachdem ich die Verbindung des Clients beende bleibt die w3wp.exe einfach bei der Größe stehen und es passiert auch nichts weiter.
Irgendwo mache ich demnach etwas falsch, ich weis aber beim besten Willen nicht was.

Muss ich noch dafür sorgen das die WebModule Threads nach abarbeitung beendet werden ? Ich dachte eigentlich das die Threadverwaltung vom IIS Manager übernommen wird
Markus
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:25 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