Esse negócio de threads é meio confuso para mim. (Lí várias coisas e a conclusão que cheguei foi essa).
Quando eu faço uma requisição é criado uma thread pelo container para atender essa requisição , se fizer outra é criado mais uma
e assim por diante.
Blz as threads não sabem lidar com HTTP mas repassam para uma ServLet que sabe, sendo assim se eu tiver 5 request para mesma servlet gerará 5 threads.
E apenas um servlet irá atender as 5 requisições.(Perguntei para o professor se isso é feito de forma enfileirado e ele me disse que não. Disse que o processador daria uma fatia (time slice) para cada thread em um tempo compartilhado por todos também chamado de time sharing.
Não sei se estou certo mas estou pensando que posso ter várias threads para um mesmo usuário(No caso de um usuário fazer várias requisições ao mesmo tempo para diferentes servlet) e várias threads de diferente usuários para uma mesma servlet.(no
caso de diferente usuários fazerem a mesma requisição).
Espero ter chegado a uma conclusão correta. (Uma outra dúvida é se for mesmo assim, criar várias threads não é algo muito custoso)?
Ainda nesse contexto não poderia ocorrer problema de concorrência e sobrecarga(devido a várias threads acessarem um mesmo servlet(no meu caso um FrontController) para o mesmo recurso)?(Como isso funciona?)
A respeito desse problema lí um artigo bem interessante aqui no GUJ falando de Thread Safety com Servlets e abordando Single Threaded vs. Multi Threaded :
http://www.guj.com.br/articles/117
Essa decisão deve ser muito bem pensada e planejada de forma que não afete tanto a performance da aplicação.
Existe mais alguma solução além da citada no artigo?
(Acho essa parte especialmente importante por isso tenho lido bastante coisa).
Aqui eu tenho uma aplicação que funciona da seguinte forma um filter captura qualquer requisição que o usuário fizer, nesse filter
eu crio uma conexão com o banco através da factory de conexões
apos a criação da conexão eu penduro a mesma em uma sessão, o método doFilter é chamado passando a request e response para meu FrontController (Minha única ServLet da aplicação).
Meu FrontController por sua vez descobre a partir da request a lógica a ser executada e por reflection invoca a mesma.
Ou seja nesse ponto a aplicação descobre em tempo de execução qual logica executar passando para ela o request e response.
Por fim a lógica chama um DAO especifico InterfaceDAO dao=new ContatoDAO() e injeta a conexão através do objeto connection capturado da sessão.(Implementei essa aplicação de outra forma Utilizando as classes HibernateUtil e HibernateDAO com generic);
Após processamento da aplicação é fechado a conexão.
Ok, me desculpe por entrar na questão de gerenciamento de conexão.(De fato da muito pano pra manga falar sobre threads), mas é que gostaria de saber qual a melhor forma de lidar com concorrência para aplicações que são acessadas por muitos usuários simultaneamente.