EJBs e DAOs utilizando pattern Singleton  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
Hempx
JavaEvangelist
[Avatar]

Membro desde: 18/04/2003 03:42:08
Mensagens: 356
Localização: Belo Horizonte
Offline

Já me falaram uma vez que não é recomendado utilizar o padrão Singleton para implementar DAO ou camada logo abaixo de EJBs. Tem um projeto aqui que tem esse arquitetura. Estou com alguns problemas de leak na aplicação mas não acho que isso seja o problema.
Mas queria saber o motivo de não ser recomendado a utilização de Singleton em DAO e na camada de negocio aqui chamada de Manager ou AppServices. Preciso de argumentos para conseguir mudar essa arquitetura aqui.
Só para tentar ilistrar melhor vou colocar uma parte do código para ver se vocês entendem:



[MSN] [ICQ]
leandroqbs
JavaTeenager

Membro desde: 21/03/2007 08:53:41
Mensagens: 181
Localização: São Paulo
Offline

cara explica isso um pouco melhor...

Att,
Leandro Souza
[Email] [MSN]
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

estas classes não armazenam estado... não tem problema serem singleton...

uma dica: não crie este monte de getInstance(). Use um conteiner de IoC, por exemplo o spring.

Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

Hempx
JavaEvangelist
[Avatar]

Membro desde: 18/04/2003 03:42:08
Mensagens: 356
Localização: Belo Horizonte
Offline

leandroqbs wrote:cara explica isso um pouco melhor...


Olha minha arquiterura:

WEB ==> EJB ==> MANAGER ==> DAO

Sendo que o manager e o dao são singletons. Já ouvi falar que isso não é uma boa prática. Mas não estou conseguindo detectar o problema, sendo que minha aplicação está com problemas de performance e leak de memória, queria saber qual o problema de utilizar essa arquitetura. Como já vou ter que fazer um tunning na aplicação eu mudaria essa arquitetura se realmente isso for um problema.


marcelo_mococa wrote:
estas classes não armazenam estado... não tem problema serem singleton...

uma dica: não crie este monte de getInstance(). Use um conteiner de IoC, por exemplo o spring.

Vlw pela dica do spring, realmente facilitaria um pouco.
Já tranguilizei um pouco em relação a essa arquitetura.
vlw pela ajuda.

Se alguém ver possíveis problemas relacionados a essa arquitetura posta aí.
[MSN] [ICQ]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

marcelo_mococa wrote:estas classes não armazenam estado... não tem problema serem singleton...


Tem sim!

Só porque uma classe não teme stado não quer dizer que ela deva ser ou tire benefícios de ser Singleton. Um Singleton deve ser utilizado apenas quando somente uma instância pode ser criada.

Fazendo uso de Singletond esta maneira você está criando uma variável global, procure toda a literatura sobre variáveis globais e seus problemas e ela pode ser aplicada neste caso.

Fora que fazendo uso pesado de métodos estáticos você perde testabilidade (faça um teste unitário usando um DAO mock por favor), além de que o uso de classes de negócio seme stado provavelmente está relacionado a programação procedural, especialmente programação com BO/VO.

http://www.google.com/search?q=singletons+are+evil

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
rflprp
GUJ Ranger

Membro desde: 27/04/2005 18:52:49
Mensagens: 822
Offline

pcalcado wrote:
marcelo_mococa wrote:estas classes não armazenam estado... não tem problema serem singleton...


Tem sim!

Só porque uma classe não teme stado não quer dizer que ela deva ser ou tire benefícios de ser Singleton. Um Singleton deve ser utilizado apenas quando somente uma instância pode ser criada.

Fazendo uso de Singletond esta maneira você está criando uma variável global, procure toda a literatura sobre variáveis globais e seus problemas e ela pode ser aplicada neste caso.

Fora que fazendo uso pesado de métodos estáticos você perde testabilidade (faça um teste unitário usando um DAO mock por favor), além de que o uso de classes de negócio seme stado provavelmente está relacionado a programação procedural, especialmente programação com BO/VO.

http://www.google.com/search?q=singletons+are+evil


Pergunta:

Pelo que entendi num artigo que lí, é necessário evitar singletons porque muitas vezes ele não economiza quase nada de rescursos (a nível de hardware) e caso eu tenha que limitar a quantodade de objetos daquela instância, deveria utilizar uma factory... correto ?

Então teoricamente o getInstance() nunca deve existir ?


[]´s
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

pcalcado wrote:
marcelo_mococa wrote:estas classes não armazenam estado... não tem problema serem singleton...

Só porque uma classe não teme stado não quer dizer que ela deva ser ou tire benefícios de ser Singleton. Um Singleton deve ser utilizado apenas quando somente uma instância pode ser criada.


ummm... qual seria a vantagem de se criar uma nova instância de uma classe que não mantêm nenhum estado?


Pelo que entendi num artigo que lí, é necessário evitar singletons porque muitas vezes ele não economiza quase nada de rescursos (a nível de hardware) e caso eu tenha que limitar a quantodade de objetos daquela instância, deveria utilizar uma factory... correto ?


Singleton economiza recursos sim... o problema é ficar criando um monte de getInstace()... Por isso que é legal usar um conteiner de IoC como o spring que já faz o papel do factory controlando os singletons.


Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team