Série de palestras ASP (9) Configurando o escopo do objeto
Autor:Eve Cole
Data da Última Atualização:2009-05-30 19:59:07
O escopo de um objeto determina quais scripts podem usar o objeto. Por padrão, quando você cria uma instância de objeto, o objeto tem escopo de página. Qualquer comando de script na mesma página ASP pode usar o objeto com escopo de página; o objeto é liberado quando a página ASP é enviada de volta ao cliente. Para a maioria dos objetos, o escopo recomendado é o escopo da página. Você pode alterar o escopo de um objeto para que ele possa ser usado por scripts em outras páginas. Este tópico explica como usar objetos com escopo de página e como alterar o escopo de um objeto.
Usando objetos de escopo de página Os objetos criados com Server.CreateObject em uma página ASP existem durante o tempo de vida da página. O objeto é acessível a qualquer comando de script da página e é liberado quando o ASP termina de processar a página. Portanto, o objeto tem o escopo ou tempo de vida da página.
Ao programar com Visual Basic ou VBScript, tome cuidado para não liberar o objeto até que o ASP termine de processar a página. Por exemplo, a instrução a seguir é frequentemente usada para liberar um objeto atribuindo à variável do objeto um valor Nothing:
Definir meuObj = Nada
Se você incluir esta instrução em uma página ASP, qualquer tentativa de usar myObj retornará um código de erro esperado. Mas internamente, o ASP ainda mantém uma referência ao objeto mesmo depois de ele ser lançado. Quando você não pode usar um objeto em um script, os recursos do objeto não são liberados até que o ASP termine de processar a página. Da mesma forma, se você liberar o objeto criando outra instância de objeto e atribuindo-o a uma variável de objeto que já foi usada, o ASP manterá uma referência à instância do objeto original. Para a maioria dos scripts, a criação de vários objetos pode não causar problemas, mas se os objetos usarem recursos compartilhados, como conexões de banco de dados, poderão surgir problemas.
Como os objetos têm escopo de página, não dependa da liberação manual de objetos. Por exemplo, o loop a seguir cria 1001 objetos Connection, que serão capazes de abrir a maioria das conexões, mesmo para um grande servidor SQL:
<%
Para I = 0 a 1000
Definir Conexão = Server.CreateObject("ADODB.Connection")
Conn.Open "string de conexão"
Próximo
%>
Em geral, você deve tentar evitar a criação de objetos dentro de um loop. Se for inevitável, você deverá liberar manualmente os recursos usados pelo objeto. Se o objeto Connection for criado apenas uma vez e a conexão física com o recurso de dados for aberta e fechada em cada loop, o exemplo acima funcionará normalmente:
<%
Definir Conexão = Server.CreateObject("ADODB.Connection")
Para I = 0 a 1000
Conn.Open "string de conexão"
Conexão Fechar
Próximo
%>
Dando escopo de sessão aos objetos Em um aplicativo, um objeto de escopo de sessão é criado para cada nova sessão e é liberado após o término da sessão. Portanto, existe um objeto para cada sessão ativa. O escopo da sessão é usado para objetos que são chamados de vários scripts, mas afetam apenas uma sessão do usuário. Você pode fornecer um escopo de sessão de objeto somente quando necessário. Se precisar usar o escopo da sessão, você deverá compreender o modelo de threading do componente que fornece o objeto, pois ele afeta o desempenho e o ambiente de segurança do objeto. Para obter mais informações, consulte "Informações avançadas: problemas de desempenho" neste tópico.
Para fornecer um escopo de sessão de objeto, armazene o objeto no objeto interno da Sessão ASP. Você pode usar a tag <OBJECT> no arquivo Global.asa ou usar o método Server.CreateObject na página ASP para criar uma sessão. objeto com escopo definido.
No arquivo Global.asa, você pode usar a tag ;OBJECT> que estende o atributo RUNAT (deve ser definido como Servidor) e o atributo SCOPE (deve ser definido como Sessão). O exemplo a seguir cria uma instância do objeto Ad Rotator com escopo de sessão:
<OBJECT RUNAT=Servidor SCOPE=ID da sessão=MyAd PROGID="MSWC.Adrotator">
</OBJETO>
Depois de armazenar um objeto no objeto Session, você poderá acessá-lo em qualquer página do aplicativo. A instrução a seguir usa a instância do objeto criada pela tag <OBJECT> no exemplo anterior:
<%= MyAd.GetAdvertisement("addata.txt") %>
Em uma página ASP, você também pode usar o método Server.CreateObject para armazenar objetos no objeto interno Session. O exemplo a seguir armazena uma instância do objeto Ad Rotator no objeto Session.
<% Definir Sessão("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
Para exibir um anúncio, você deve primeiro obter uma instância do objeto Ad Rotator armazenado no objeto Session e, em seguida, chamar um método para exibir o objeto:
<% Definir MeuAnúncio = Sessão("MeuAnúncio") %>
<%= MyAd.GetAdvertisement("addata.txt") %>
O ASP não cria uma instância de um objeto declarado com a marca <OBJECT> até que seja referenciado por um comando de script em um arquivo .asp. O método Server.CreateObject cria imediatamente uma instância do objeto. Portanto, é melhor usar a tag <OBJECT> do que a propriedade Server.CreateObject para objetos com escopo de sessão.
Dê um escopo de aplicativo de objeto
Um objeto de escopo de aplicativo é uma instância única de um objeto criado quando o aplicativo é iniciado. Este objeto é compartilhado por todas as solicitações do cliente. Somente em casos raros você precisa fornecer um escopo de aplicação de objeto. Alguns objetos utilitários, como contadores, etc., podem exigir escopo de aplicação. Mas, em geral, você pode usar as alternativas sugeridas na próxima seção. Além disso, o modelo de threading afeta o desempenho e o ambiente de segurança do objeto (consulte "Informações avançadas: problemas de desempenho" neste tópico).
Para fornecer um escopo de aplicativo de objeto e armazená-lo no objeto interno do Aplicativo ASP, você pode usar a tag <OBJECT> no arquivo Global.asa ou criar o escopo do aplicativo usando o método Server.CreateObject na instância do objeto de página ASP .
No arquivo Global.asa, você pode usar a tag ;OBJECT> que estende o atributo RUNAT (deve ser definido como Servidor) e o atributo SCOPE (deve ser definido como Sessão). Em páginas ASP, você pode usar Server.CreateObject para armazenar instâncias de objetos no objeto interno Application. Para obter um exemplo usando a tag <OBJECT> e Server.CreateObject, consulte a seção anterior, "Atribuindo escopo de sessão a um objeto".
Alternativas ao escopo de sessão e aplicativo Forneça um escopo de sessão ou aplicativo de objeto somente quando necessário. Porque esses objetos permanecem até que a sessão ou aplicação termine. Eles consomem recursos como memória ou conexões de banco de dados que podem ser mais úteis de outras maneiras. Além disso, o modelo de threading de um componente afeta o desempenho dos objetos criados a partir dele, especialmente aqueles que possuem escopo de sessão ou de aplicativo.
Em muitos casos, uma abordagem melhor do que criar objetos com escopo de aplicativo ou de sessão é usar variáveis com escopo de sessão ou de aplicativo para transmitir informações a objetos criados no nível da página. Por exemplo, não forneça ao objeto Conexão ADO escopo de sessão ou aplicativo porque a conexão que ele cria permanecerá aberta por um longo período de tempo enquanto o script não usa mais o compartilhamento de conexão ODBC. No entanto, você pode armazenar a string de conexão ODBC no objeto interno Sessão ou Aplicativo e obter a string da instância do objeto Connection criada na página da web. Dessa forma, você pode armazenar informações usadas com frequência em um namespace de sessão ou aplicativo, mas apenas criar objetos com essas informações quando necessário.
Objetos JScript definidos pelo usuário Você pode criar seus próprios objetos JScript definindo um construtor que cria e inicializa as propriedades e métodos do novo objeto. Quando um script chama o construtor usando o operador new, uma instância do objeto é criada. O script ASP oferece suporte a objetos definidos pelo usuário, que funcionam corretamente quando têm escopo de página. No entanto, se um objeto JScript definido pelo usuário receber escopo de aplicativo ou sessão, isso poderá afetar a funcionalidade do objeto. Em particular, se um objeto tiver escopo de sessão ou de aplicação, os scripts de outras páginas poderão obter as propriedades do objeto, mas não poderão chamar seus métodos.
Informações avançadas: Problemas de desempenho O modelo de threading do componente pode afetar o desempenho do site. De modo geral, os objetos marcados com Ambos são recomendados para uso em todos os scripts ASP, especialmente nos objetos Sessão e Aplicativo. Objetos de thread único estão obsoletos.
Como nem sempre é possível controlar o modelo de threading dos objetos usados, as diretrizes a seguir podem ajudá-lo a obter o desempenho ideal:
Objeto de escopo de página. Objetos marcados como Ambos ou Apartamento proporcionarão o melhor desempenho.
Objeto de escopo do aplicativo. Em geral, você deve evitar colocar objetos no objeto Aplicativo. Se precisar usar objetos de escopo de aplicativo, você obterá o melhor desempenho de um objeto marcado com Both combinado com FreeThreadedMarshaler. Você pode usar a tag <OBJECT> ou usar o método Server.CreateObject para armazenar objetos com as tags Single, Free ou Both no objeto Application. Você deve usar a tag <OBJECT> com objetos com thread de apartamento.
Objeto de escopo de sessão. Objetos marcados com Ambos proporcionarão o melhor desempenho. O uso de objetos de thread único ou de thread de apartamento fará com que o servidor Web bloqueie a sessão em um thread. Objetos de thread livre não bloqueiam a sessão, mas não são executados tão rápido. No objeto Session, você pode usar a tag <OBJECT> ou o método Server.CreateObject para armazenar objetos.
Se você instalou a documentação do SDK, obterá informações detalhadas sobre o modelo de threading e o desempenho do componente que ele implica. (A documentação do SDK não está disponível no Windows 95 e posterior.)