Servlet acessada por multiplos usuários (Threads)?

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…

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.

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???

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!

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+