Announcement

Collapse
No announcement yet.

ADOExpress und Multithreading

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADOExpress und Multithreading

    Jeder Thread, der auf die BDE zugreift, braucht eine eigene Verbindung zur Datenbank, oder anders: eine eigene TSession- und TDatabase-Instanz.

    Welche erwähnenswerten Rahmenbedingungen gibt es nun, wenn mittels ADOExpress mit mehreren Threads auf Datenbanken zugegriffen wird?

    Gruß<br>
    Stephan

  • #2
    Oh..Oh.. **bluebitDenkenDasDasNachÄrgerRiecht** :-

    Comment


    • #3
      Hallo,

      hinter ADO Express verbergen sich nur VCL-Wrapperkomponenten für die originalen COM-Objekte (ADO) von Microsoft. Daher gelten genau die gleichen Regeln wie für den Multithread-Zugriff auf COM-Objekte. Jeder Thread muss ein neues <b>Apartment</b> (CoInitialize oder CoInitializeEx) initialisieren, bevor zum ersten Mal ein Interface-Zeiger auf die ADO-COM-Objekte angefordert wird.

      Das ADO und Threads funktioniert, zeigen <b>ISAPI</b>-DLLs für den IIS oder <b>MTS</b>- bzw. <b>COM+</b> Anwendungen. In beiden Fällen werden die Module über einen Thread-Pool (IIS oder MTS/COM+) ausgeführt. Das folgende Beispiel für eine ISAPI-DLL demonstriert die Vorgehensweise:
      <pre>
      uses
      Windows, Messages, SysUtils, Classes, HTTPApp, Db, ADODB, DBWeb;

      type
      TWebModule1 = class(TWebModule)
      ADOConnection1: TADOConnection;
      ADOTable1: TADOTable;
      DataSetTableProducer1: TDataSetTableProducer;
      ADOTable1AUFTAGSNR: TAutoIncField;
      ADOTable1AUFTRAG: TWideStringField;
      ADOTable1TERMIN: TWideStringField;
      ADOTable1STATUS: TWideStringField;
      ADOTable1PERSON: TWideStringField;
      PageProducerINSERT: TPageProducer;
      PageProducerDELETE: TPageProducer;
      procedure WebModuleCreate(Sender: TObject);
      procedure WebModuleDestroy(Sender: TObject);
      procedure WebModule1WebActionItemShowAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure WebModule1WebActionItem1Action(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure WebModule1WA_PostRecordAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure WebModule1WA_SelectDeleteAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure WebModule1WA_DoDeleteAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure PageProducerINSERTHTMLTag(Sender: TObject; Tag: TTag;
      const TagString: String; TagParams: TStrings;
      var ReplaceText: String);
      procedure WebModule1WA_NewRecordAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      procedure PageProducerDELETEHTMLTag(Sender: TObject; Tag: TTag;
      const TagString: String; TagParams: TStrings;
      var ReplaceText: String);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;

      var
      WebModule1: TWebModule1;

      implementation

      {$R *.DFM}

      uses ActiveX;

      const
      NL = #13#10;

      procedure TWebModule1.WebModuleCreate(Sender: TObject);
      begin
      CoInitialize(nil);
      end;

      procedure TWebModule1.WebModule1WebActionItemShowAction(Send er: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      begin
      ADOConnection1.Connected := True;
      with DataSetTableProducer1 do
      begin
      Dataset.Filtered := False;
      Dataset.Filter := '';
      Dataset.Open;
      Response.Content := Content;
      DataSet.Close;
      end;
      ADOConnection1.Connected := False;
      end;

      ....

      procedure TWebModule1.WebModuleDestroy(Sender: TObject);
      begin
      CoUninitialize;
      end;
      </pre>
      Liefert man die innerhalb der ISAPI-DLL über <b>GetCurrentThreadID</b> ermittelt Thread-ID zurück, erhält jeder parallel abrufende Client einen eigenen Wert - das ISAPI-Modul wird also vom IIS über verschiedenen Threads parallel ausgeführt.

      P.S: ADO-Objekte "lieben" STA's, daher sollte das Threading-Modell <i>Apartment</i> (der Vorgabewert von Delphi) für den Client verwendet werden

      Comment

      Working...
      X