Aplicacion distribuida (n capas)

23/05/2006 - 20:35 por AOG | Informe spam
Hola,
Tengo un proyecto en VB 2005 con arquitectura distribuida expongo la capa de
negocio atravez de COM+ (libreria EnterpriseServices). El problema es que
cuando el cliente hace petición a la capa de negocio me da un error:
No pudo realizarse la activación de COM+ ya que ésta no pudo completarse en
el espacio de tiempo especificado. (Excepción de HRESULT: 0x8004E024)

Esto sucede cuando lleno una Grid y hago consecutivamente una petición por
cada fila para obtener el valor de un campo de una tabla (SQL server), es
decir, accedo 133 veces, bueno no llega porque me da el error a los 80 veces
a la capa de negoacio.
El ciclo es: la capa de Interfaz de Usuario llama a la capa de negocio
(Com+) esta a su vez a la de datos, devolviendo el resultado.

He provado a aumentar los valores:
<EnterpriseServices.ObjectPooling(minPoolSize:= 20, maxPoolSize: 00,
CreationTimeout: 000)> _

tambien e quitado de la cabecera de mi clase (capa de negocio)
<EnterpriseServices.ObjectPooling...> y
<EnterpriseServices.JustInTimeActivation()
y nada sigue igual

¿Como puedo evitar este error? , ¿que está sucediendo?

Gracias, un saludo

Preguntas similare

Leer las respuestas

#6 Carlos Gómez
24/05/2006 - 11:48 | Informe spam
AOG ha escrito:

hola carlos, si que cierro la conexion cuando termino de la consulta y vuelvo
a crear una nueva cuando vuelvo a acceder a la capa de datos. No es mejor asi
para descargar recursos?



Depende, crear una conexion nueva es un proceso costoso. si la vas a
acceder a la BBDD poco tiempo despues de un acceso, es preferible
reusarla en vez de cerrar - destruir - crear - abrir

Ademas, en tu mensaje no dices que la destruyes, sólo que la cierras y
seguidamente creas una nueva conexion, por lo que en ese momento tienes
2 conexiones apuntando a la BBDD, y despues 3

Prueba ha hacer un Dispose a la conexion que cierras antes de crear
otra para asegurar que la 'eliminas'

Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#7 Jesús López
24/05/2006 - 21:29 | Informe spam
Esa implementación del método finalize no es correcta, en realidad es
preferible no tener ninguna implementación del método finalize a tener una
como la que muestras.

Deberías implementar el método Finalize sólo en el caso de que tu clase haga
uso de recursos no gestionados o que y en este caso deberías implementar el
interfaz IDisposable.

También deberías implementar el interfaz IDisposable en el caso de que tu
clase cree objetos que implementan dicho interfaz.

Hay que evitar en la medida de lo posible que se ejecute el método Finalize
de cualquier objeto. Para ello se implementa el interfaz IDisposable y se
llama a GC.SuppressFinalize(Me) en el método Dispose. Un objeto que
implementa Finalize y para el que no se ha suprimido su finalización
mediante GC.SupressFinalize sobrevive a la mayoría de las recolecciones de
basura, ya que el recolector de basura la mayoría de las veces sólo
recolecta los objetos de la generación 0 y un objeto que implementa
GC.SupressFinalize se comporta como si nunca pertenerciera a la generación
0.

Por otra parte no entiendo que pinta una atentificación basada en
encabezados SOAP en un componente COM+, ya que COM+ tiene sus propios
mecanismos de autentificación y seguridad. Y los encabezados SOAP es algo
que se usa en los Servicios Web.

¿Podrías aclararnos qué es lo que estás haciendo?

Saludos:

Jesús López

"AOG" escribió en el mensaje
news:
Hola Dany,
yo lo que hago es que en el metodo Protected Overrides Sub Finalize() de
la
clase (capa de negocio) he implenentado:

Protected Overrides Sub Finalize()
_MantemimientoAD = Nothing
MyBase.Finalize()
End Sub

donde _MantemimientoAD es la instancio de la cla acceso a datos que
destruye
a este que es donde hace la conexión y demas operaciones de acceso a
datos. Y

En la clase que llama a la capa de negocio:

Public Function Buscar(ByVal BaseDatos As String, ByVal NombreTabla As
String, ByVal Condicion As String) As Data.DataSet
GestionCabeceraSOAP.Autenticacion(Me.HeaderUsuarioValue)
Dim oMatemiCN As MantemimientoCN = GetOMantemiCN()
Dim dt As DataSet = oMatemiCN.Buscar(BaseDatos, NombreTabla,
Condicion)
oMatemiCN.Dispose() 'Destruyo la instancia capa negocio
Return dt
End Function

Esto es lo que hago

Un saludo


"Developers - Dany Acosta" escribió:

Tu Componente lo destruyes correctamente???...



AOG escribió:
> Hola,
> Tengo un proyecto en VB 2005 con arquitectura distribuida expongo la
> capa de
> negocio atravez de COM+ (libreria EnterpriseServices). El problema es
> que
> cuando el cliente hace petición a la capa de negocio me da un error:
> No pudo realizarse la activación de COM+ ya que ésta no pudo
> completarse en
> el espacio de tiempo especificado. (Excepción de HRESULT: 0x8004E024)
>
> Esto sucede cuando lleno una Grid y hago consecutivamente una petición
> por
> cada fila para obtener el valor de un campo de una tabla (SQL server),
> es
> decir, accedo 133 veces, bueno no llega porque me da el error a los 80
> veces
> a la capa de negoacio.
> El ciclo es: la capa de Interfaz de Usuario llama a la capa de negocio
> (Com+) esta a su vez a la de datos, devolviendo el resultado.
>
> He provado a aumentar los valores:
> <EnterpriseServices.ObjectPooling(minPoolSize:= 20, maxPoolSize: 00,
> CreationTimeout: 000)> _
>
> tambien e quitado de la cabecera de mi clase (capa de negocio)
> <EnterpriseServices.ObjectPooling...> y
> <EnterpriseServices.JustInTimeActivation()
> y nada sigue igual
>
> ¿Como puedo evitar este error? , ¿que está sucediendo?
>
> Gracias, un saludo
>
>

Respuesta Responder a este mensaje
#8 AOG
29/05/2006 - 10:56 | Informe spam
Hola Jesús,
el encabezado SOAP no se encuentra en un componente COM+, está en un
Servicio Web. Te explico exactamente como está distribuida la arquitectura:
- Cliente, interfaz de usuario
- Servicio Web
- Capa de negocio (expuesta en componentes COM+)
- Capa acceso a datos
- Librerías o interfaces para acceder a la Base Datos (crea conexiones,
objetos command, DataReader, etc.)
- Base de Datos (MS SQL Server o MySQL)
El cliente accede a la capa de negocio (expuesta en componentes COM+)
remotamente a través de un Servicio Web.
El trozo de código donde está el encabezado SOAP corresponde a un método del
Serviceo Web que accede a un componente capa de negocio.
Espero que te haya aclarado un poco la arquitectura de mi proyecto.
Con respecto a implementar al interfaz IDisposable, me podrías poner un
ejemplo.

Bien, Por otro lado he conseguido eliminar el error Excepción de HRESULT:
0x8004E024)

He ido quitando a mi clases la utilización de EnterpriseServices (Inherits
System.EnterpriseServices.ServicedComponent) y comprobé que era una clase que
accedía antes de la clase donde me devuelve el dataset que estaba expuesta
como componente COM+ la quite y volví a registra y ya no me da ningún tipo de
error.
Se ve que no estaba bien registrada como componete COM+ o en su momento
tendría un problema la clase y la corregí pero la que estama registrada sería
la versión anterior.

Bueno el caso es que ya va todo bien, gracias y un saludo a todos.






"Jesús López" escribió:

Esa implementación del método finalize no es correcta, en realidad es
preferible no tener ninguna implementación del método finalize a tener una
como la que muestras.

Deberías implementar el método Finalize sólo en el caso de que tu clase haga
uso de recursos no gestionados o que y en este caso deberías implementar el
interfaz IDisposable.

También deberías implementar el interfaz IDisposable en el caso de que tu
clase cree objetos que implementan dicho interfaz.

Hay que evitar en la medida de lo posible que se ejecute el método Finalize
de cualquier objeto. Para ello se implementa el interfaz IDisposable y se
llama a GC.SuppressFinalize(Me) en el método Dispose. Un objeto que
implementa Finalize y para el que no se ha suprimido su finalización
mediante GC.SupressFinalize sobrevive a la mayoría de las recolecciones de
basura, ya que el recolector de basura la mayoría de las veces sólo
recolecta los objetos de la generación 0 y un objeto que implementa
GC.SupressFinalize se comporta como si nunca pertenerciera a la generación
0.

Por otra parte no entiendo que pinta una atentificación basada en
encabezados SOAP en un componente COM+, ya que COM+ tiene sus propios
mecanismos de autentificación y seguridad. Y los encabezados SOAP es algo
que se usa en los Servicios Web.

¿Podrías aclararnos qué es lo que estás haciendo?

Saludos:

Jesús López

"AOG" escribió en el mensaje
news:
> Hola Dany,
> yo lo que hago es que en el metodo Protected Overrides Sub Finalize() de
> la
> clase (capa de negocio) he implenentado:
>
> Protected Overrides Sub Finalize()
> _MantemimientoAD = Nothing
> MyBase.Finalize()
> End Sub
>
> donde _MantemimientoAD es la instancio de la cla acceso a datos que
> destruye
> a este que es donde hace la conexión y demas operaciones de acceso a
> datos. Y
>
> En la clase que llama a la capa de negocio:
>
> Public Function Buscar(ByVal BaseDatos As String, ByVal NombreTabla As
> String, ByVal Condicion As String) As Data.DataSet
> GestionCabeceraSOAP.Autenticacion(Me.HeaderUsuarioValue)
> Dim oMatemiCN As MantemimientoCN = GetOMantemiCN()
> Dim dt As DataSet = oMatemiCN.Buscar(BaseDatos, NombreTabla,
> Condicion)
> oMatemiCN.Dispose() 'Destruyo la instancia capa negocio
> Return dt
> End Function
>
> Esto es lo que hago
>
> Un saludo
>
>
> "Developers - Dany Acosta" escribió:
>
>> Tu Componente lo destruyes correctamente???...
>>
>>
>>
>> AOG escribió:
>> > Hola,
>> > Tengo un proyecto en VB 2005 con arquitectura distribuida expongo la
>> > capa de
>> > negocio atravez de COM+ (libreria EnterpriseServices). El problema es
>> > que
>> > cuando el cliente hace petición a la capa de negocio me da un error:
>> > No pudo realizarse la activación de COM+ ya que ésta no pudo
>> > completarse en
>> > el espacio de tiempo especificado. (Excepción de HRESULT: 0x8004E024)
>> >
>> > Esto sucede cuando lleno una Grid y hago consecutivamente una petición
>> > por
>> > cada fila para obtener el valor de un campo de una tabla (SQL server),
>> > es
>> > decir, accedo 133 veces, bueno no llega porque me da el error a los 80
>> > veces
>> > a la capa de negoacio.
>> > El ciclo es: la capa de Interfaz de Usuario llama a la capa de negocio
>> > (Com+) esta a su vez a la de datos, devolviendo el resultado.
>> >
>> > He provado a aumentar los valores:
>> > <EnterpriseServices.ObjectPooling(minPoolSize:= 20, maxPoolSize: 00,
>> > CreationTimeout: 000)> _
>> >
>> > tambien e quitado de la cabecera de mi clase (capa de negocio)
>> > <EnterpriseServices.ObjectPooling...> y
>> > <EnterpriseServices.JustInTimeActivation()
>> > y nada sigue igual
>> >
>> > ¿Como puedo evitar este error? , ¿que está sucediendo?
>> >
>> > Gracias, un saludo
>> >
>> >
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida