Servlet acessada por multiplos usuários (Threads)?

4 respostas
J

Pessoal, estou com um pequeno problema de estrutura…vamos lá…

estou desenvolvendo um sistema em 3 camadas (jsp - servlet - banco de dados) o meu problema é o seguinte:

  • A utilização por um único usuário o sistema se comporta muito bem, mas quando vários usuários efetuam os request’s para a servlet ai que ocorre o problema, pois ocorre concorrencia de request’s e alguns users não conseguem executar suas queryes…

Como posso contornar este problema utilizando Thread’s…Eu tenho alguma prática com Threads porem não estou conseguindo utiliza-las dentro da minha classe “HttpServlet”…Se alguem já desenvolveu algum sistema parecido onde multiplos usuários vão acessar, por favor me ajudem com esta questão…

4 Respostas

H

JBeto,

As instâncias de uma servlet já são threads independentes. O que talvez falte no seu sistema seja a sincronização de transações. As operações concorrentes que devem ser sincronizadas podem ser definidas da seguinte forma:

1 - Um conjunto de acessos ao BD considerado atômico;

2 - O acesso a uma variável estática;

3 - O acesso a um objeto em particular (eu disse [i]objeto[/], e não [i]classe[/]).

Para cada operação, defina um bloco sincronizado onde o lock seja respectivamente:

1 - O objeto Class de uma classe comum à transação (um bean, talvez);

2 - O objeto Class da classe onde está a variável estática;

3 - Uma referência ao objeto compartilhado.
J

Vc poderia exemplificar este comentário??

//Este é o exemplo da estrutura que estou usando na minha servlet
//caso 2 usuarios tentem se logar, ou consultar simultaneamente, um deles não vai conseguir

//+++++++Exemplo básico de como está minha servlet++++++++++

public void doPost(HttpResquest req, HttpResponse)
{

String solicitacao = req.getParameter("solicitacao")

if(solicitacao.equals("login")
{
  // recebe os parametros para o login, executa a consulta no BD e 
 // redireciona para uma JSP caso ok...
}
if(solicitacao.equals("consulta"))
{
  // recebe os parametros para a consulta, executa a consulta no BD e 
 // redireciona para uma JSP com o resultado da consulta...
}

}

Poderia com base no exemplo acima demostrar sua resposta anterior???

S

Posso estar escrevendo besteira, mas o problema parece estar no acesso ao bd, que não é multi-threrad, mas concorrente!

Veja se não está mantendo a conexão aberta!

H

JBeto,

Como você está realizando somente consulta, a resposta do spier faz todo o sentido.

Em todo o caso, para ilustrar o uso de sincronismo…

class X
{
  static s = "xxx";
}

class Y
{
}

class Z extends HttpServlet
{
  static Y y;

  public void init()
  {
     y = new Y();
  }

  public void doPost(HttpResquest req, HttpResponse)   
  {
    ...
    synchronized(X.class)
    {
      s = zzz();
      s += "\r\n"; 
    }
    synchronized(y)
    {
      www(y);
      zzzz(y);
    }
    synchronized(W.class)
    {
       W w = new W(req.getParameter("nome"), 
                            req.getParameter("idade"));
       w.save();
    }   
  }
}

class W
{
  void save()
  {
     Connection con = ...;
     ...
     stmt.executeUpdate("SELECT ...");
     stmt.executeUpdate("INSERT...");
     stmt.executeUpdate("UPDATE ...");

     con.close();
  }
}

Usando com critério esse conceito, evita-se o funcionamento errático de um sistema.

T+

Criado 9 de julho de 2004
Ultima resposta 10 de jul. de 2004
Respostas 4
Participantes 3