Estou com uma dúvida aqui uma classe DAO. ela se aplica ao pattern Singleton ? pois eu acho que não preciso de mais que uma instancia p/ executar operações CRUD.
Só que acho que estou errado pois nunca e revista nem livro nenhum vi uma classe DAO Singleton, existe alguma coisa errada nisso ?
Pensei até em concorrência, mais como o objeto Statement e ResultSet são locais nos métodos o mesmos nem synchronized precisam ser caso o pattern seja Singleton.
nao é so porque voce nao sente necessidade de ter mais de uma instancia de uma mesma classe que voce deve utilizar o singleton. voce deve usa-lo quando voce PRECISA que exista apenas uma instancia. o que é raro…
dao costuma nao ser singleton, porque normalmente ele precisa de um atributo (como uma Connection, Session ou EntityManager), e voce nao quer esse atributo unico para toda a sua aplicacao
Eu só trabalho com aplicações web (struts), e acho que o singleton geralmente gera problemas.
Em especial, tive um problema muito grande com uma classe chamada DAO que era um singleton, compartlhado entre vários contexts. O verdadeiro inferno, que demoramos algumas semanas para resolver.
Já em aplicação stand-alone (Swing, por exemplo), eu até aceito a idéia do singleton, mas preferiria uma Fabrica de DAO no lugar.
[quote=felipesp]Eu só trabalho com aplicações web (struts), e acho que o singleton geralmente gera problemas.
[/quote]
Embora considerado anti-pattern, quem gera problemas de concorrência não é o singleton, mas sim aquele quem usa de maneira indevida! A documentação do Struts é clara em relação a thread-safe!
Será que esse “context” tá no lugar certo? Seu DAO precisa mesmo manter estado específico de uma chamada? Será que o problema tá com o singleton mesmo?
Se, por ex, o DAO for um singleton e estiver mantendo uma Connection em sua instancia, e não houver nenhum tratamento para garantir thread-safe, aí claramente terá problemas de concorrencia!
O Spring Framework, por exemplo, internamente, usa ThreadLocal para manter todo o contexto que é específico de uma thread, como o objeto Connection (de forma que cada thread atua em uma transação diferente).
Poiati:
Respondendo a sua pergunta, o pattern pode ser aplicado ao DAO sim, desde que sejam tomados alguns cuidados de concorrencia. Se utilizar o Spring Framework, melhor ainda, pois além de não ter que se preocupar com a concorrencia sobre os objetos Connection/Session, nao tem que implementar o padrao singleton em sua classe, pois isso é apenas um detalhe de configuração no Application Context (que, por default, já é singleton).
Bom, é claro, a não ser que voce tenha um bom motivo pra nao fazer nada disso! Normalmente nao…
O context a que me referia é o context do tomcat, ou seja, uma aplicação tomcat.
Nosso DAO foi desenhado para ser utilizado em um único context, mas depois surgiram uma desena de contexts, e tivemos de levar o DAO para um jar, quando a lambança ocorreu.
Realmente foi problema de design, claramente. O meu argumento é que o padrão singleton, nesse caso não trouxe nenhum benefício papável, pois ele se destinava a evitar consumo de memória ao evitar várias instancias em memória. Coisa que nem daria um impacto tão grande.
O problema é que os sistemas estavam acostumados a um DAO que encapsula uma Connection, e o datasource de cada aplicação era diferente, com acesso a tabelas diferentes e tal. Não dava para manter o padrão e usar o DAO em uma dezena de aplicações…