Delen via


Vereisten voor poolbare objecten

Poolbare objecten moeten aan bepaalde vereisten voldoen, zodat een enkel objectexemplaar door meerdere klanten kan worden gebruikt.

Staatloos

Om beveiliging, consistentie en isolatie te behouden, mogen poolbare objecten geen clientspecifieke status van client naar client hebben. U kunt elke status per client beheren met behulp van IObjectControl-, het uitvoeren van contextspecifieke initialisatie met IObjectControl::Activeer en schoon elke clientstatus op met IObjectControl::D eactivate. Zie Objectlevensduur en -status beherenvoor meer informatie.

Geen thread-affiniteit

Poolbare objecten kunnen niet worden gebonden aan een bepaalde thread; anders kunnen de prestaties mogelijk rampzalig zijn. Daarom kunnen poolbare objecten niet worden gemarkeerd om te worden uitgevoerd in het appartementsmodel; ze moeten worden uitgevoerd in het multithreaded appartement of het neutrale appartement. Daarnaast mogen poolbare objecten geen lokale threadopslag gebruiken en mogen ze de free-threaded marshaler niet aggregeren. Zie COM+ Threading Modelsvoor meer informatie over threading in COM+.

Notitie

De Microsoft Visual Basic 6.0- en eerdere ontwikkelomgevingen kunnen alleen onderdelen van het appartementsmodel maken. In Visual Basic .NET kunnen onderdelen echter worden gegroepeerd.

 

Agregeerbaar

Poolbare objecten moeten aggregatie ondersteunen, dat wil zeggen, ze moeten worden gemaakt door CoCreateInstance aan te roepen met een niet-NULL pUnkOuter argument. Wanneer COM+ een gegroepeerd object activeert, wordt er een aggregatie gemaakt om de levensduur van het gegroepeerde object te beheren en methoden aan te roepen op IObjectControl-. Zie Aggregationvoor meer informatie over het schrijven van samenvoegbare objecten.

Transactionele onderdelen

Poolbare objecten die deelnemen aan transacties, moeten beheerde resources handmatig aanmelden. Wanneer het gepoold is, is het niet mogelijk voor de resourcebeheerder om automatisch deel te nemen aan een transactie als uw object een beheerde bron bevat, zoals een databaseverbinding, op het moment dat het object in een bepaalde context wordt geactiveerd. Daarom moet het object zelf de logica verwerken van het opsporen van de transactie, het uitschakelen van de automatische aanmelding van de resourcemanager en het handmatig aanmelden van resources die het bevat. Bovendien moet een transactioneel gegroepeerd object de huidige status van de resources weergeven in de parameterwaarden van IObjectControl::CanBePooled. Zie Transactionele objecten groeperenvoor meer informatie.

IObjectControl implementeren om de levensduur van het object te beheren

Poolbare objecten moeten IObjectControl-implementeren, hoewel dit niet strikt noodzakelijk is. Transactionele onderdelen die zijn gegroepeerd, moeten echter IObjectControl-implementeren. Deze onderdelen moeten de status controleren van de resources die ze bewaren en aangeven wanneer ze niet opnieuw kunnen worden gebruikt; wanneer IObjectControl::CanBePooled onwaar retourneert, wordt een transactie verdoemd. Zie Objectlevensduur en -status beherenvoor meer informatie.

Taalbeperkingen

Onderdelen die met behulp van Microsoft Visual Basic 6.0 en eerder zijn ontwikkeld, kunnen niet worden gepoold omdat deze onderdelen gethread worden volgens een appartementsmodel. In Visual Basic .NET kunnen onderdelen echter worden gegroepeerd.

Verouderde onderdelen

Zolang ze niet-transactioneel zijn en voldoen aan de juiste voorgaande vereisten, kunnen onderdelen worden gegroepeerd, zelfs als ze niet specifiek zijn geschreven met poolfunctionaliteit in gedachten. Het is niet nodig om IObjectControl-te implementeren; een onderdeel dat dit niet doet, neemt niet deel aan het beheer van de levensduur. Als IObjectControl::CanBePooled niet is geïmplementeerd, wordt het object opnieuw gebruikt totdat de pool de maximale grootte bereikt.

COM+ Object Constructor-tekenreeksen

objectlevensduur en -status beheren

hoe objectpooling werkt

Prestaties verbeteren met objectpooling

transactionele objecten groeperen