Tenho diversos DAOs, sendo que a conexão ao BD é criada dentro de cada um deles através de um ConnectionFactory que criei. O ConnectionFactory tem um método estático getConnection que recebe o nome do usuário no banco e a respectiva senha, realiza a conexào e retorna a dita cuja para o DAO solicitante.
Como fazer para que, a cada vez que eu instanciar um DAO, não precisar ficar passando o login e senha do usuário para autenticação?!
Mas assim qualquer usuário iria se conectar com o mesmo login e senha padrão? Eu queria amarrar o nome/senha de cada usuário com o que eles já tem cadastrado no BD, pois esse BD já é utilizado em outra aplicação desktop, que realiza autenticação direto no banco, mas é escrita em C++ e não utiliza pattern nenhum, é tudo misturado, regra de negócio, sql, etc…
Como pode ver, o método getConnection recebe o nome de usuário e a senha. Imaginei fazer de um jeito que esses dados fossem os mesmos que o usuário utilizou para se logar no sistema, pois estes usuários e senhas já estão cadastrados no banco de dados que vou utilizar. Todos os DAOs pegarão a conexão através dessa Factory. Porém, dessa forma eu teria que estar sempre passando o nome de usuário e a senha no contrutor de todos os DAOs… Isso seria muito ruim…
Queria uma maneira de mapear as conexões com os usuários logados, minimizando essa repetição de código que o modelo acima provocaria. Na verdade preciso ter uma conexão autenticada com nome de usuário e senha diferentes para cada usuário do sistema, por isso não posso adotar a solução que vc colocou acima…
Sugestão: crie uma lista mapeando cada usuário logado (session???) com uma connection. No login do sistema você abre a conexão e insere nesta lista. No ConnectionFactory.getConnection você percorre a lista e devolve a connection deste usuário. No logout, retire da lista e feche a conexão. Vai ser necessário criar um mecanismo de “inatividade” da conexão, pois senão pode correr o risco de ficar muitas conexões abertas que o usuário “foi embora”.
Tome cuidado se vai ser possível abrir outra janela e logar de novo (mesma session).
Ao invés de criar a conexão dentro do DAO, crie na classe de negócio, ou de controle.
Como é um sistema WEB, vc pode criá-la no login do usuário, guardar em uma ThreadLocal amarrada a sessão do usuário, e os seus DAO’s, ao invé de criar a Connection, receberia ela no construtor do DAO.
Assim vc cria a connection no login e reutiliza o resto da vida util da sessão.
Acho que uma solução bastante razoável é a descrita pelo thingol no post mencionado acima, ou seja, o pool de conexões se encarrega de autenticar o usuário no banco se ele ainda não o fez. Se ele já foi autenticado, a conexão é obtida através do pool.
Só objetos que podem ser serializados devem ser adicionados a uma sessão.
Acredito que a solução com ThreadLocal não atende a este princípio.
Concordo com você, por isso acho razoável a idéia fornecida pelo Thingol. Como estou com o mesmo problema, mas ainda não o resolvi (outras prioridades apareceram), aparentemente não precisaria ser feito nada. Esse trabalho seria feito pelo pool.
Portanto não precisaria ser criado este hash com o id da sessão, pois para o pool a chave será o usuário/senha da conexão.
Gostei das idéias que li aqui… tenho que fazer alguns testes para ver o que fica melhor implementar, mesmo porque ainda estou começando no desenvolvimento web.
Conforme forem surgindo dúvidas e idéias eu vou postando. Muito obrigado a todas as respostas!
hum… até eu aprender Spring… minha idéia seria utilizar algum framework mais simples e essa parte das conexões fazer na mão mesmo… mas vou acabar usando um pool mesmo…