Ciclo de Vída do Servlet

10 respostas
rfpsatin

Salve pessoal.

tenho uma dúvida q pode ser básica p/ vc’s + :wink:

vai lá:

Estou dando uma lida no cápitulo 3 do livro
Java Servlet Programming
do Jason Hunter

e estou com alguma dúvidas.

Haverá sempre uma única instância do servlet compartilhada pelas n requisições do cliente?

posso ter 100 clientes acessando um servlet, (usando o exemplo do livro) contador. Estes 100 clientes estarão compartilhando a mesma instância do servlet, correto? bem foi o q entendi.

o livro em seguinda trata de um exemplo q ele chama de contador holistic. Não entendi bem, + pelo q entendi ela fala q posso ter + que uma instância do servlet rodando e sendo acessada pelo cliente.
este ponto eu não entendi bem.

depois ele aborda o conceito de POOL de conexões. Se entendi corretamente, posso ter um pool de conexões servlet, 1 cliente acessando uma instância específica, uma em separado, uma p/ cada um…
desde que minha classe implemente a interface SingleThreadModel, tipo

public class teste extends HttpServlet implements SingleThreadModel{

}

Isto é garantia q terei uma instância distinta p/ cada cliente.

É isso mesmo???
tenho sempre uma instância compartilhada p/ n requisições e p/ eu ter 1 p/ 1 terei q fazer a classe implementar esta interface?

e o caso o contados holistico q mencionei? onde ele entra?

Valeu pessoal, um abraço a todos.

10 Respostas

C

Ricardo aproveitando seu tópico quero fazer uma pergunta.

Galera isso que o Ricardo falou tem alguma coisa haver com o fato de eu ter que reiniciar o tomcat toda vez que altero algum dos meus servlets?

rfpsatin

Não sei + quero complementar a pergunta com o seguinte.

Toda vez q faço meu arquivo .war e o tomcat já esta rodando a versão antiga tenho q reiniciar ele pois ele não aceita sobrepor, tem como mudar isso?

Rafael_Steil

Sim, ha uma unica instancia do Servlet em memoria… O Servlet Container ( Tomcat, por exemplo ) instancia e inicia as configuracoes gerias na primeira vez que alguem requisita o Servlet, e depois deixa essa intancia em memoria para as requisicoes seguintes.

Sim, pode ter 100 ou qualquer outro numero de clientes, que todos irao usar a mesma instancia.

O lance do pool com SingleThreadModel eh suicidio. Nunca use esse esquema, ou a sua performance ira desabar, pois somente um cliente conseguira acessar a aplicacao por vez ( dentre outros problemas que podem vir a ocorrer ).

Se voce chegar no ponto de dizer “eu preciso de uma instancia diferente do meu servlt para cada requisiicao”, entao ha algum problema no teu sistema… ou seja, a implementacao tem que ser mudada.

Eh importante ressaltar que “uma unica instancia em memoria” nao significa que os dados especificos de cada requisicao irao interferir em outra. Porem, ha algumas coisinhas que voce nao deve fazer… uma delas eh declarar algo como

public class MeuServlet extends HttpServlet {
    private String nomeUsuario;
    ....
}

Aqui, o membro privado “nomeUsuario” nao poderia ser usado internamente - ou melhor, nao deveria ser usado - para guardar o nome do usuario que esta acessando a aplicacao no momento, por exemplo. Para resolver, uma saida seria guardar o nome na sessao ou cookie de cada um.

Variaveis “static” valem para todas as requisicoes, como esperado.

Rafael

Rafael_Steil

“cbras”:
Ricardo aproveitando seu tópico quero fazer uma pergunta.

Galera isso que o Ricardo falou tem alguma coisa haver com o fato de eu ter que reiniciar o tomcat toda vez que altero algum dos meus servlets?

Isso provavelmente eh por causa de alguma configuracao no Tomcat. Uma saida eh configurar o contexto da tua aplicacao, no arquvo server.xml, com o atributo “reloadable” com o valor “true” ( reloadable=“true” )

Rafael

rfpsatin

Rafael…

Bom, eu não preciso ter um singletread pois posso ter o mesmo efeito (isolamento) usando blocos synchronized certo?

bom e o exemplo q o livro trata, deixa explicitar:

import java.io.*;
 import java.util.*;
 import javax.servlet.*;
 import javax.servlet.http.*;

 public class HolisticCounter extends HttpServlet{
    static int classCount = 0; //shared by all instances
    int count = 0; // separete for each servlet
    static Hastable instances = new Hastable(); // also shared
   
  public void doGet(...) {
     
     res.setContentyTpe("text/html");
     PrintWriter out=res.getWriter();
     count++;
     out.println("Since loading, this servlet instance has been acceesed " + count + " times "") ;

    instances.put(this,this);
    out.println("There are currently " + instances.size() + " instances. ");
   
  classCount++;
  out.println("across all instances, this servlet class has been " + "access " + classCount + " times ");
  }

}

bom a saída q ele oferece mostra q há diferenças nas variáveis.

Não entendi este exemplo.

quer dizer q há diferença entre variáveis static e não static?
não há apenas uma instância, como isso é possível?

valeu, abraço

Ricardo

rfpsatin

já q há apenas uma instância, static e não static não teria q “ser” a mesma coisa, ter o mesmo resultado?

abraço

C

Um dos motivos para a depreciação na especificação 2.4 dos “Thread Safe Servlets” ( os que implementam SingleThreadModel ) é que eles não são 100% thread safe.
Uma simples propriedade ‘static’ compromete toda a segurança de sincronização, pois este tipo de propriedade é compartilhada por todas as instâncias dentro da mesma JVM.
Existem poucas razões para se ter uma propriedade ‘static’ em um Servlet, e eu particularmente não as uso.
O ideal é vc estudar e conhecer bem os eventos de cíclo de vida dos Servlets e usá-los corretamente.
E respondendo ao ultimo post, sim. Se existe somente uma instancia de qualquer classe dentro da mesma VM, campos static e não static devem se comportar da mesma forma, exceto pelas regras de uso de campos static que têm suas particularidades, como poder estar dentro de blocos static e por ai vai…

danieldestro

Alguns Servlet Containers podem manter um pool de intâncias de servlets.

N

O que o DanielDestro quis dizer é que não existe na especificação de servlets a obrigatoriedade de haver apenas uma instância de servlet para todos os usuários. Essa é a implementação adotada por alguns containers de hoje, por exemplo, Tomcat.

As implementações de Servlet Container estão livres para optar por essa implementação, mas nada proíbe que existam mais de uma instância de servlet por container, ou um pool de instâncias. Isso pode ser feito, talvez, para uma melhoria de performance, maior paralelismo, entre outras.

Só para esclarecer, as propriedades estáticas (static) podem ser vistas como “propriedades da classe” e não “propriedades da instância”. Entendeu ? Você tem sempre uma única classe X, mas pode ter várias instâncias dessa classe no seu sistema.

Por exemplo:

public class X {
       private int A;
       static int B;
       .....
   }

No caso da classe X acima, se existirem 5 instâncias da classe, existirão 5 instâncias do atributo A (nao static, da instância) mas apenas uma instância do atributo B (static, da classe).

Outra, você pode utilizar o “Tomcat Manager” para fazer o “reload” de sua aplicação, para isso, utilize a propriedade “reloadable” como descrito aqui neste forum e acesso o “Tomcat Manager” no endereço "http://localhost:8080/manager/html.

Pra encerrar, implementar SingleThreadModel não implica em existir uma instância do Servlet por cliente. Também a especificação Servlet determina que se o servlet implementa SingleThreadModel, implica em que apenas um cliente deve acessar o Servlet por vez, não deve haver concorrência entre clientes. Isso pode ser obtido de diversas formas, entre elas, um servlet sincronizado, outra, um Pool de Servlets com um servlet por cliente. Cada container de servlet está livre para escolher sua implementação favorita :wink: .

:roll:

rfpsatin

Certo pessoal, correto.

Então só p/ ver se entendi corretamente.

A princípio posso há apenas UMA instância do Servlet na memória, carregado pelo Container. Só q não há nada q impressa dele (o container)ter “N” intâncias em memória.

Qto ao uso de static ou não static eu compreendo a idéia, só não havia entendido o seguinte.
Uso o Tomcat, alguém aqui disse q a política de funcionamento do Tomcat é uma única instância, contudo, rodando aquele exemplo ele da saídas diferentes p/ variáveis de instância e variáveis de classe.

SENDO uma única instância a definição abaixo é verdadeira certo:

static int i = int i

ou seja, pouco importa (não entrando nos detalhes) se estou usando static ou não elas vão ter o mesmo valor certo?!

Agora, pelo q da a entender então, o Tomcat faz uso de um Spool de Servlet’s q ele mesmo cria e gerencia, estou errado?

um abraço pessoal

Ricardo

Criado 9 de novembro de 2003
Ultima resposta 10 de nov. de 2003
Respostas 10
Participantes 6