Olá…
Estou tentando utilizar alguns DAOs, até aí tudo bem.
Mas cheguei no ponto de criar a conexão com o DB…
Estou pensando em utilizar um pool de conexões também!
Qual seria a melhor forma de criar essa conexão ? ter um método que “fale” com o DataSource e me retorne a conexão ?
Em uma app de final de curso, no contrutor do meu dao eu faço assim:
public EmpresaDAO() {
conn = SabesDataSource.getConnection();
}
Quando eu chamo este método getConnection da classe SabesDataSource, se a conexão não está aberta e a transação não foi iniciada, ele cria pra mim e inicia a transação.
Eu acho esta abordagem bém legal. Vc poderia fazer com que este método getConnection soubesse pegar sua connexão à partir de um pool.
Vc pode depois cria um GenericAbstractDAO por exemplo com um contrutor igual ao que citei acima. Ai todos seus DAO’s estendem ele e herdam esta forma de coletar a connection!
Nesse teu exemplo que controla o ciclo de vida da transacao? Quem faz o commit ou rollback? E ainda, se tens operacao em cascata como fica as transacoes?
Fazer commit, rollback de transações dentro do Action é muito feio, o código de acesso ao banco de dados não pode se “espalhar” para fora da camada de persistência (ou pelo menos não deveria poder).
Se isso é uma aplicação web, você poderia usar um filtro pra fazer isso, dar o commit ou rollback da transação e fechar a conexão quando tudo terminasse, mas não deixe esse código dentro do action.
A meu ver o Dao tem que ficar independente da camada de transacao, justamente pra nao ficar acoplado.
Imagina que hoje tu tem um modelo de transacao baseado so no JDBC, utilizando o commit e rollback da interface connection e derrepente tu resolve mudar isso utilizando JTA por exemplo. Se isso estiver acoplado no teu DAO o refactoring vai ser grande.
Esse esquema de filtro é bom, antes de usar o Spring com AOP eu fazia parecido com isso, mas usando um interceptor do WebWork.
Hm, eu ficaria também com a abordagem da inversão de controle neste caso, para os mais moderninhos, a Injeção por Dependência :mrgreen:
O Spring tem uma abordagem muito legal, e a configuração do teu JDBC não precisa ficar dentro de uma “Connection”, deixa que tudo isso seja feito pelo spring
Isso depende da forma como seus DAOs são construidos.
Se você estiver usando uma abstract factory para criar os DAOs, deixa com a factory a responsabilidade de arrumar a connection e passar para cada DAO.
Se não estiver usando factories, o mais facil é usar uma thread local com a connection, isso vai diminuir o acoplamento inferente (esse é o termo?) aos DAOs.
Você ainda pode usar um container de IoC, que vai fazer a injeção das dependências dos teus DAOs, a connection.