Problema com sessões do Tomcat

Pessoal, estou com um problema em um aplicativo. Vou descrever ele aí embaixo. Me desculpem ser tão formal, mas foi a forma que encontrei de explicar a coisa ao mesmo tempo que detalhes inicialmente desnecessários são abstraídos.

Se alguém pudesse me ajudar, eu ficaria muito grato, pois não tenho a menor idéia de onde procurar o erro.


Considere o seguinte cenário:

  • Um servidor tomcat “T”;
  • Um aplicativo de login único para várias aplicações (SSO) chamado “L”, colocado em “T”;
  • Vários aplicativos em “T” que se utilizam da autenticação provida por “L”;

Um usuário que utilize uma aplicação qualquer em “T” acessa o aplciativo “L”, faz o logon, e então aparece uma lista de ícones dos aplicativos aos quais ele tem direito de acessar. Em seguida, ele clica no ícone do aplicativo desejado, e é direcionado para o tal aplicativo, que já recebe a informação de qual usuário é ele.

Continuando o cenário:

  • Entre os aplicativos em “T”, existe um aplicativo interessante chamado “S”. Ele é interessante porque seus usuários são divididos em grupos “G1” a “Gn”, de tal forma que cada grupo “Gi” possui um banco de dados exclusivo “Bi” em um computador “Mi”;
  • Além disso, “S” possui um banco que não está associado a nenhum grupo, chamado “BS”, instalado no computador “MS”, com o objetivo de guardar as informações de qual usuário pertence a qual grupo e os dados do banco de dados de cada grupo (ip, senha, etc).

Quando um usuário “u” acessa “S”, este sistema verifica a qual grupo o usuário pertence, monta uma conexão com o banco “Bu” e armazena esta conexão na sessão do usuário “u”. NUNCA MAIS DURANTE A SESSÃO o banco “BS” é consultado, apenas recupera-se a conexão na sessão e busca-se os dados através desta conexão.

O problema:

Em um dado momento, um usuário “u1” de um grupo “G1” acessou uma página do sistema. Esta página apresentava vários dados guardados na sessão, e um dado (e apenas um dado) veio do usuário “u2” do grupo “G2”. Mas todos os outros dados na página vieram corretamente de “G1”. No código da aplicativo, na parte em que os dados são buscados do banco e colocados na sessão, a conexão é buscada apenas uma vez, e utilizada para a obtenção de todos os dados. Como que apenas um viria do banco de dados errado?

Alguém tem alguma sugestão do que poderia estar causando o problema?

Começando pelo fato de que a conexão é guardada na sessão, já está errado.

Obrigado por responder, Daniel.

Como que o fato da conexão ser armazenada na sessão poderia causar este problema?

É um erro guardar a conexão na sessão, pois assim, para 20 usuários, você precisará de 20 conexões simultâneas, mas não deve ser isso que está ocasionando o erro…

É melhor você colocar um breakpoint no setter destes dados, ou gerar um log e um stacktrace a cada vez que eles forem acessados, pois alguém está colocando este dado lá, e isso que está errado e você quer descubrir, certo ?

Verifique se este dado é carregado no momento em que todos os outros dados de u1 são carregados, ou se é após esta primeira carga.
Se for depois, com certeza é um código indevido, e, se você achar muito demorado ou chato de encontrar este trecho, pode aplicar uma lógica de freeze nestes dados, fazendo com que, após congelá-lo, não efetive os setters.

Sim, guardar as conexões na sessão talvez não seja uma boa, mas o impacto não é tão grande, porque são vários bancos, na média 1 para cada 3 usuários, logo o risco de se esgotar as conexões por banco é pequeno. Além disso, economiza-se o tempo de montar uma conexão a cada consulta. Um pool de conexões seria complicado, pois os usuários não podem trocar as conexões entre si aleatoriamente, já que cada conexão acessa um banco diferente.

micheldavid, obrigado pelas sugestões, vou testá-las e se descobrir algo eu posto aqui para feedback.

se mais alguém tiver alguma idéia, tb seria bem-vinda.

valew!

O negócio vai ser debugar a aplicação para achar a falha. Deve ser algum ponto da programação.

Quanto às conexões… Imagina se os usuários fecham o browser sem LOGOUT… Você ficaria com as conexões presas até o timeout da sessão http… E se for configurado sem timeout… vai estourar o limite uma hora.

Pense numa estratégia para recuperar as conexões utilizando múltiplos POOLS (aka Factory).

Uma hipótese provável é que outro usuário se logou no mesmo browser sem que a sessão anterior tivesse sido corretamente encerrada. Neste caso po ser que ficou algum dado residual que foi apresentado indevidamente.