Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El servicio de agrupación de objetos COM+ permite reducir la sobrecarga al crear cada objeto desde cero. Cuando se activa un objeto, se saca del grupo. Cuando se desactiva un objeto, se vuelve a colocar en el grupo, a la espera de una solicitud futura.
La agrupación de objetos se puede configurar aplicando el atributo ObjectPoolingAttribute a una clase derivada de la clase System.EnterpriseServices.ServicedComponent.
La agrupación de objetos permite controlar el número de conexiones que se utilizan, en contraste con la agrupación de conexiones, en que se controla el número máximo alcanzado. A continuación se destacan las diferencias entre la agrupación de objetos y la de conexiones:
- Creación. Cuando se usa la agrupación de conexiones, la creación se realiza en el mismo subproceso, de modo que si no hay nada en el grupo, se crea una conexión. En la agrupación de objetos, el grupo puede decidir crear un nuevo objeto. Sin embargo, si ya se ha alcanzado el máximo, lo que hace es proporcionar el siguiente objeto disponible. Este comportamiento es crucial cuando se tarda mucho en crear un objeto, pero no se utiliza durante mucho tiempo.
- Exigencia de mínimos y máximos. No se hace en la agrupación de conexiones. El valor máximo en la agrupación de objetos es muy importante en lo que se refiere al tamaño de la aplicación. Podría ser necesario tener que multiplexar miles de solicitudes sólo a algunos objetos. (Las pruebas comparativas de TPC/C dependen de esto).
La agrupación de objetos COM+ es idéntica a la agrupación de conexiones administradas a clientes SQL de .NET Framework. Por ejemplo, la creación se realiza en otro subproceso y los mínimos y máximos son obligatorios.
**Nota **Los dominios de aplicación afectan al comportamiento de la agrupación de objetos. En Microsoft Windows 2000, cuando la activación de aplicaciones está establecida en Library y se tienen varios dominios de aplicaciones, todos los objetos agrupados se crean en el dominio de aplicación predeterminado y se comparten entre varios clientes. En la misma situación, con Microsoft Windows XP y Windows Server 2003, hay un grupo de objetos por dominio de aplicación. En cualquiera de los dos sistemas operativos, con varios dominios de aplicación y la activación de aplicaciones establecida en servidor, los clientes fuera de proceso utilizan el grupo de objetos del dominio de aplicación predeterminado.
En el ejemplo siguiente se establecen los límites de tamaño y de tiempo de espera en la clase 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 **En general, no tiene que llamar a DisposeObject desde el cliente cuando utiliza componentes con servicio. No obstante, es necesario hacerlo si está utilizando el servicio de agrupación de objetos COM+ mientras el servicio de activación Just-in-Time (JIT) no está habilitado. En este caso, para comprobar que es seguro devolver el objeto a la agrupación, es necesario notificar a COM+ que se ha terminado de utilizar el objeto. Por lo general, si se intenta realizar una sola llamada cada vez en un objeto agrupado, es una buena idea habilitar la activación JIT con la agrupación de objetos. Si intenta obtener una referencia y realizar varias llamadas sobre la misma, el hecho de utilizar la agrupación de objetos sin la activación JIT puede dar lugar a una mejora del rendimiento.
Vea también
Resumen de servicios COM+ disponibles | ObjectPoolingAttribute | System.EnterpriseServices (Espacio de nombres)