Serie de conferencias ASP (9) Configuración del alcance del objeto
Autor:Eve Cole
Fecha de actualización:2009-05-30 19:59:07
El alcance de un objeto determina qué scripts pueden utilizar el objeto. De forma predeterminada, cuando crea una instancia de objeto, el objeto tiene alcance de página. Cualquier comando de script dentro de la misma página ASP puede utilizar el objeto de ámbito de página; el objeto se libera cuando la página ASP se devuelve al cliente. Para la mayoría de los objetos, el alcance recomendado es el alcance de la página. Puede cambiar el alcance de un objeto para que pueda ser utilizado por scripts en otras páginas. Este tema explica cómo utilizar objetos con ámbito de página y cómo cambiar el alcance de un objeto.
Uso de objetos de alcance de página Los objetos creados con Server.CreateObject en una página ASP existen durante la vida útil de la página. El objeto es accesible para cualquier comando de script para la página y se libera cuando ASP ha terminado de procesar la página. Por tanto, el objeto tiene el alcance o la vida útil de la página.
Al programar con Visual Basic o VBScript, tenga cuidado de no liberar el objeto hasta que ASP haya terminado de procesar la página. Por ejemplo, la siguiente declaración se usa a menudo para liberar un objeto asignando a la variable del objeto un valor de Nada:
Establecer myObj = Nada
Si incluye esta declaración en una página ASP, cualquier intento de utilizar myObj devolverá un código de error esperado. Pero internamente, ASP aún conserva una referencia al objeto incluso después de su liberación. Cuando no puede utilizar un objeto en un script, los recursos del objeto no se liberan hasta que ASP haya terminado de procesar la página. Del mismo modo, si libera el objeto creando otra instancia de objeto y asignándola a una variable de objeto que ya se ha utilizado, ASP conserva una referencia a la instancia de objeto original. Para la mayoría de los scripts, es posible que la creación de varios objetos no cause problemas, pero si los objetos utilizan recursos compartidos, como conexiones de bases de datos, pueden surgir problemas.
Dado que los objetos tienen alcance de página, no confíe en liberar objetos manualmente. Por ejemplo, el siguiente bucle crea 1001 objetos de conexión, que podrán abrir la mayoría de las conexiones incluso a un servidor SQL grande:
<%
Para I = 0 a 1000
Establecer conexión = Server.CreateObject ("ADODB.Connection")
Conn.Open "cadena de conexión"
Próximo
%>
En general, deberías intentar evitar la creación de objetos dentro de un bucle. Si es inevitable, debe liberar manualmente los recursos utilizados por el objeto. Si el objeto Conexión se crea solo una vez y la conexión física al recurso de datos se abre y cierra en cada bucle, entonces el ejemplo anterior funcionará normalmente:
<%
Establecer conexión = Server.CreateObject ("ADODB.Connection")
Para I = 0 a 1000
Conn.Open "cadena de conexión"
Conexión.Cerrar
Próximo
%>
Dar a los objetos alcance de sesión En una aplicación, se crea un objeto de alcance de sesión para cada nueva sesión y se libera después de que finaliza la sesión. Por tanto, hay un objeto por cada sesión activa. El alcance de la sesión se utiliza para objetos que se llaman desde múltiples scripts, pero que solo afectan a una sesión de usuario. Puede otorgarle alcance a la sesión de un objeto solo cuando sea necesario. Si necesita utilizar el alcance de la sesión, debe comprender el modelo de subprocesamiento del componente que proporciona el objeto, porque afecta el rendimiento y el entorno de seguridad del objeto. Para obtener más información, consulte "Información avanzada: problemas de rendimiento" en este tema.
Para dar un alcance de sesión de objeto, almacene el objeto en el objeto incorporado de sesión ASP. Puede usar la etiqueta <OBJECT> en el archivo Global.asa o usar el método Server.CreateObject en la página ASP para crear una sesión. objeto con alcance. Instancia de objeto de dominio.
En el archivo Global.asa, puede usar la etiqueta ;OBJECT> que extiende el atributo RUNAT (debe establecerse en Servidor) y el atributo SCOPE (debe establecerse en Sesión). El siguiente ejemplo crea una instancia con ámbito de sesión del objeto Ad Rotator:
<OBJECT RUNAT=Servidor SCOPE=ID de sesión=MiAnuncio PROGID="MSWC.Adrotator">
</OBJETO>
Una vez que almacena un objeto en el objeto Sesión, puede acceder al objeto desde cualquier página de la aplicación. La siguiente declaración utiliza la instancia de objeto creada por la etiqueta <OBJECT> en el ejemplo anterior:
<%= MiAnuncio.GetAdvertisement("addata.txt") %>
En una página ASP, también puede utilizar el método Server.CreateObject para almacenar objetos en el objeto integrado Session. El siguiente ejemplo almacena una instancia del objeto Ad Rotator en el objeto Session.
<% Establecer sesión("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
Para mostrar un anuncio, primero debe obtener una instancia del objeto Ad Rotator almacenado en el objeto Session y luego llamar a un método para mostrar el objeto:
<% Establecer MiAnuncio = Sesión("MiAnuncio") %>
<%= MiAnuncio.GetAdvertisement("addata.txt") %>
ASP no crea una instancia de un objeto declarado con la etiqueta <OBJECT> hasta que un comando de secuencia de comandos en un archivo .asp haga referencia a él. El método Server.CreateObject crea inmediatamente una instancia del objeto. Por lo tanto, es mejor utilizar la etiqueta <OBJECT> que la propiedad Server.CreateObject para objetos con ámbito de sesión.
Dar un alcance de aplicación de objeto
Un objeto de ámbito de aplicación es una instancia única de un objeto que se crea cuando se inicia la aplicación. Este objeto es compartido por todas las solicitudes de los clientes. Sólo en casos excepcionales es necesario dar un ámbito de aplicación al objeto. Algunos objetos de utilidad, como contadores, etc., pueden requerir un ámbito de aplicación. Pero, en general, puedes utilizar las alternativas sugeridas en la siguiente sección. Además, el modelo de subprocesos afecta el rendimiento y el entorno de seguridad de los objetos (consulte "Información avanzada: problemas de rendimiento" en este tema).
Para darle un alcance de aplicación a un objeto y almacenarlo en el objeto incorporado de la aplicación ASP, puede usar la etiqueta <OBJECT> en el archivo Global.asa o crear el alcance de la aplicación usando el método Server.CreateObject en la instancia del objeto de página ASP. .
En el archivo Global.asa, puede usar la etiqueta ;OBJECT> que extiende el atributo RUNAT (debe establecerse en Servidor) y el atributo SCOPE (debe establecerse en Sesión). En las páginas ASP, puede utilizar Server.CreateObject para almacenar instancias de objetos en el objeto integrado de la aplicación. Para ver un ejemplo de uso de la etiqueta <OBJECT> y Server.CreateObject, consulte la sección anterior, "Cómo otorgar alcance de sesión a un objeto".
Alternativas al alcance de la sesión y de la aplicación Proporcione un alcance de sesión o aplicación de objeto sólo cuando sea necesario. Porque estos objetos permanecen hasta que finaliza la sesión o aplicación. Consumen recursos como memoria o conexiones de bases de datos que podrían ser más útiles de otras maneras. Además, el modelo de subprocesos de un componente afecta el rendimiento de los objetos que crea a partir de él, especialmente aquellos que tienen alcance de sesión o aplicación.
En muchos casos, un mejor enfoque que crear objetos con ámbito de aplicación o sesión es utilizar variables con ámbito de sesión o aplicación para pasar información a objetos creados en el nivel de página. Por ejemplo, no le dé al objeto ADO Connection un alcance de sesión o aplicación porque la conexión que crea permanecerá abierta durante un largo período de tiempo mientras el script ya no utilice la conexión compartida ODBC. Sin embargo, puede almacenar la cadena de conexión ODBC en el objeto integrado Sesión o Aplicación y obtener la cadena de la instancia del objeto Conexión creada en la página web. De esta manera, puede almacenar información de uso frecuente en una sesión o espacio de nombres de aplicación, pero solo crear objetos con esa información cuando sea necesario.
Objetos JScript definidos por el usuario Puede crear sus propios objetos JScript definiendo un constructor que crea e inicializa las propiedades y métodos del nuevo objeto. Cuando un script llama al constructor utilizando el nuevo operador, se crea una instancia del objeto. El script ASP admite objetos definidos por el usuario, que funcionan correctamente cuando tienen alcance de página. Sin embargo, si a un objeto JScript definido por el usuario se le asigna un ámbito de aplicación o sesión, puede afectar la funcionalidad del objeto. En particular, si un objeto tiene alcance de sesión o aplicación, los scripts de otras páginas pueden obtener las propiedades del objeto pero no pueden llamar a sus métodos.
Información avanzada: Problemas de rendimiento El modelo de subprocesos del componente puede afectar el rendimiento del sitio web. En términos generales, se recomienda el uso de los objetos marcados con Ambos en todos los scripts ASP, especialmente en los objetos Sesión y Aplicación. Los objetos de un solo subproceso están en desuso.
Debido a que es posible que no siempre controle el modelo de subprocesamiento de los objetos que utiliza, las siguientes pautas pueden ayudarlo a lograr un rendimiento óptimo:
Objeto de alcance de página. Los objetos marcados como Ambos o Apartamento le darán el mejor rendimiento.
Objeto de ámbito de aplicación. En general, se debe evitar colocar objetos en el objeto Aplicación. Si necesita utilizar objetos del ámbito de la aplicación, obtendrá el mejor rendimiento con un objeto con ambas etiquetas combinado con FreeThreadedMarshaler. Puede usar la etiqueta <OBJECT> o usar el método Server.CreateObject para almacenar objetos con las etiquetas Single, Free o Both en el objeto Aplicación. Debe utilizar la etiqueta <OBJECT> con objetos con subprocesos de apartamento.
Objeto de alcance de sesión. Los objetos marcados con Ambos te darán el mejor rendimiento. El uso de objetos de subproceso único o de subproceso apartamento hará que el servidor web bloquee la sesión en un subproceso. Los objetos con subprocesos libres no bloquean la sesión, pero no se ejecutan tan rápido. En el objeto Session, puede utilizar la etiqueta <OBJECT> o el método Server.CreateObject para almacenar objetos.
Si ha instalado la documentación del SDK, obtendrá información detallada sobre el modelo de subprocesos y el rendimiento de los componentes que implica. (La documentación del SDK no está disponible en Windows 95 y versiones posteriores).