Pool di oggetti

Con il servizio di pool di oggetti COM+ è possibile ridurre il carico derivante dalla creazione di oggetti completamente nuovi. Quando viene attivato, l'oggetto viene estratto dal pool, quando viene disattivato, l'oggetto viene collocato nuovamente nel pool in attesa della richiesta successiva.

È possibile configurare il pool di oggetti applicando l'attributo ObjectPoolingAttribute a una classe derivata da System.EnterpriseServices.ServicedComponent.

Il pool di oggetti consente di controllare il numero di connessioni utilizzate, al contrario del pool di connessioni, che consente di controllare il numero massimo raggiunto. Di seguito sono riportate le differenze principali tra il pool di oggetti e il pool di connessioni:

  • Creazione. Quando si utilizza il pool di connessioni, la creazione viene eseguita sullo stesso thread, quindi se il pool è vuoto, viene creata una connessione. Nel pool di oggetti, è possibile che venga creato un nuovo oggetto. Tuttavia, se è già stato raggiunto il numero massimo, viene fornito l'oggetto disponibile successivo. Questa funzionalità risulta molto importante quando il processo di creazione dell'oggetto richiede una notevole quantità di tempo, ma l'oggetto viene utilizzato solo per un periodo breve.
  • Attivazione dei valori massimi e minimi. Questa funzione non è disponibile nel pool di connessioni. Il valore massimo nel pool di oggetti rappresenta un fattore molto importante se si desidera scalare un'applicazione. È possibile che sia necessario elaborare migliaia di richieste solo per pochi oggetti. Le valutazioni TPC/C si basano su questa funzione.

Il pool di oggetti COM+ è praticamente identico al pool di connessioni di SQL Client gestito di .NET Framework. La creazione, ad esempio, avviene su un thread diverso e i valori minimi e massimi vengono attivati.

**Nota   **Il comportamento del pool di oggetti è influenzato dai domini applicazione. Se si utilizza Microsoft Windows 2000, quando l'attivazione dell'applicazione è impostata su Library e sono presenti più domini applicazione, gli oggetti del pool verranno creati nel dominio applicazione predefinito e condivisi da più client. Nella stessa situazione, ma utilizzando Microsoft Windows XP e Windows Server 2003, si avrà un pool di oggetti per ciascun dominio applicazione. Se si utilizza uno dei due sistemi operativi quando sono presenti più domini applicazione e l'attivazione dell'applicazione è impostata su server, i client out-of-process utilizzeranno il pool di oggetti nel dominio applicazione predefinito.

Nell'esempio seguente vengono impostati i limiti della dimensione e di timeout della classe TestObjectPooling:

<ObjectPooling(MinPoolSize := 2, MaxPoolSize := 5, _
CreationTimeout := 20000)> _
Public Class TestObjectPooling 
Inherits ServicedComponent
      Public Sub Perform ()
            ' Method contents go here.
      End Sub 
      Public Overrides Sub Activate()
            ' Called when removed from the pool.
      End Sub 
      Public Overrides Sub Deactivate()
            ' Called before deactivating or placing back in pool.
      End Sub 
      Public Overrides Function CanBePooled() As Boolean
            ' Called after Deactivate. Indicate your vote here.
            Return True
      End Function 
End Class 
[C#]
[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeOut=20000)]
public class TestObjectPooling : ServicedComponent
{
      public void Perform ()
      {
         // Method contents go here.
      }
      public override void Activate()
      {
         // Called when removed from the pool.
      }
      public override void Deactivate()
      {
         // Called before deactivating or placing back in pool.
      }
      public override bool CanBePooled()
      {
         // Called after Deactivate. Indicate your vote here.
         return true;
      }
}

Client

Public Class App
      Overloads Public Shared Sub Main(args() As String)
            Dim order As New TestObjectPooling()
            order.Perform()
            ' To return the object to the object pool, use DisposeObject.
            ' This returns the object to the pool and allows it to be reused.
            ' If this call is not made, the garbage collector returns it to the pool
            ' in a non-deterministic fashion, which hinders performance
            ' of an application that depends on object pooling to conserve 
            ' expensive resources. 
            ServicedComponent.DisposeObject (order)
      End Sub
End Class
[C#]
public class App
{
      public static int Main(string[] args)
      {
            TestObjectPooling order = new TestObjectPooling();
            order.Perform();
            /* To return the object to the object pool, use DisposeObject.
            This returns the object to the pool and allows it to be reused. 
            If this call is not made, the garbage collector returns it to the pool
            in a non-deterministic fashion, which hinders performance 
            of an application that depends on object pooling to conserve 
            expensive resources. */
            ServicedComponent.DisposeObject (order);
      }
}

**Nota   **In generale, quando si utilizzano i componenti serviti, non occorre chiamare DisposeObject dal client. È invece necessario quando si utilizza il servizio di pool di oggetti COM+ e il servizio di attivazione Just-in-Time (JIT) non è attivato. In questo caso, per garantire che il reinserimento dell'oggetto nel pool sia esente da rischi, è necessario notificare a COM+ che l'utilizzo dell'oggetto è terminato. Se si prevede di effettuare una sola chiamata alla volta su un oggetto del pool, è solitamente consigliabile abilitare l'attivazione JIT e il pool dell'oggetto. Se invece si prevede di acquisire un riferimento per chiamare l'oggetto più volte, sarà possibile ottenere prestazioni migliori con il pool dell'oggetto senza attivazione JIT.

Vedere anche

Riepilogo dei servizi COM+ disponibili | ObjectPoolingAttribute | Spazio dei nomi System.EnterpriseServices