DAO e Singleton

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

mas cada caso eh um caso

Precisa de mais de um EntityManager em uma aplicaçao ?

Como Paulo falou, acredito que para DAO isso fique inviável, a não ser que você queira simular realmente um “lock”.

Eu uso muito singleton quando estou trabalhando com Swing, para impedir que sejam duplicados os JInternalFrame

Você pode usar DAOs singletons sim. Em especial, se você trabalha com frameworks como o Spring.

poderia explicar os motivos disso?

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… :wink:

entity manager não é thread safe …
tu precisa de pelo menos um por request/thread

Gerson escreveu:

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…

entity manager não é thread safe …
tu precisa de pelo menos um por request/thread[/quote]

Depende muito quem está implementando o JPA. JPA é apenas uma especificação de uma API Java. EntityManager é apenas uma interface.

Pelo menos a implementação do entitymanager do hibernate é thread safe.
Dê uma olhadinha na doc do hibernate:

Aqui mostra a Session no qual o EntityManagerImpl do hibernate trabalha para realizar as operações SQL.
http://docs.jboss.org/hibernate/orm/4.1/javadocs/