Announcement

Collapse
No announcement yet.

(De-) Aktivierung von COM+ Objekten in .NET

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

  • (De-) Aktivierung von COM+ Objekten in .NET

    Hallo,
    ich habe zum ersten mal einen COM+ (DOTNET Enterprise Service) in VS2005 implementiert und diesen auf einem Win2003 R2 Server installiert.
    Das Projekt orientiert sich am den Teilnehmern von BASTA etc. bekannten Projekt dotnetESDemo von Andreas Kosch.
    Alles funktioniert soweit auch ganz gut, bis auf ein kleines Problem:
    Alle jemals aktivierten Objekte werden nicht mehr deaktiviert. D.h. nach 1000 Aufrufen bleiebn 1000 aktivierte Objekte im COM+ stehen. Jetzt ist meine Frage, ob das eine Eigenart der Ent.services ist, bzw. wann diese Objekte wieder abgeräumt werden. Bisher war ich es unter COM+ (Objekte wurden mit D7 erstellt) so gewohnt, daß die Objekte automatisch wieder abgeräumt werden.
    Bei der Serveranwendung habe ich eingestellt: "Bei Leerlauf nicht herunterfahren." Die anderen Einstellungen (Attribute) lauten:

    Code:
      [TransactionAttribute(TransactionOption.NotSupported),
      JustInTimeActivation(true),
      EventTrackingEnabled(true),
      DescriptionAttribute("GetBMPRS 1.0"),
      ObjectPooling(MinPoolSize=2, MaxPoolSize=5),
      Guid("1EB65B65-AA64-476b-8544-7A4A5A7C6E0B")]
      public class GetBMPRS : ServicedComponent, IGetBMPRS
    Vielleicht wäre noch zu erwähnen, daß das Serverobjekt über RDS vom IIS aufgerufen wird.

    Danke für Tips und Grüße
    Hermann
    Zuletzt editiert von Hermann Schmidt; 24.05.2007, 11:25.

  • #2
    Hallo,

    Jetzt ist meine Frage, ob das eine Eigenart der Ent.services ist,
    Nein, der Zählenstand der aktiven Objektinstanzen sollte immer dann wieder auf 0 gehen, wenn der letzte Client seinen letzten Verweis auf den .NET Enterprise Service freigebeben hat. Wenn dies nicht passiert, hat der Client "die Schuld" daran. Ein .NET Enterprise Service wird in eine COM+ Anwendung (Win32) installiert, so dass die "alten" COM-Regeln (AddRef vs. Release) für die Referenzzählung eines Interface-Zeigers gelten. COM gibt eine Objektinstanz erst dann frei, wenn der letzte Interface-Zeiger auf diese Instanz vom Client freigegeben wurde.

    Vielleicht wäre noch zu erwähnen, daß das Serverobjekt über RDS vom IIS aufgerufen wird.
    Das ist in der heutige Zeit eher ungewöhnlich, oder liefert der .NET Enterprise Service ein ADO-Recordset zurück?
    Was passiert, wenn der IIS zum Test heruntergefahren wird - geht dann der Zählerstand zurück?

    Comment


    • #3
      Hallo,
      vielen Dank für die rasche Antwort. Habe jetzt mal die COM+ Anwendung und den IIS neu gestartet. Jetzt sieht das Szenario so aus:
      -
      Erster Aufruf aktiviert ein Objekt. Dieses bleibt aktiv.

      -
      Weitere Aufrufe erzeugen bei Bedarf Objekte, die jedoch wieder freigegeben werden.

      - Hat das erste (aktiv verbliebene) Objekt nichts zu tun, wird dieses von folgenden Aufrufen genutzt.

      Ein Neustart des IIS deaktiviert nicht (!) das aktive Objekt. Ein Objekt bleibt immer aktiv, bis die COM+ Anwendung nach 3 Min. automatisch herunterfährt. Dieses Szenario ist erstmal nicht tragisch, da ja nur maximal 1 Objekt aktiv bleibt. Merkwürdig ist das schon, insbesondere weil andere COM+ Anwendungen (bzw. deren Objekte) auf dem gleichen Server dieses Verhalten nicht aufweisen.

      Zu RDS: RDS ist für mich heute immer noch der schnellste Weg, ADO-Recordsets über das Internet zu befördern. Mag sein, daß die binäre Serialisierung des ADO.NET Datasets ähnlich performant ist - da aber noch Delphi6/7 Clients die Daten "konsumieren", ist RDS der einzig verbleibende Weg.

      Viele Grüße

      Comment

      Working...
      X