Pessoal, eu gostaria de saber do pessoal mais experiente, que já tem uma certa experiência tambem com Hibernate, qual a maneira mais “correta” ou a mais indicada …
Eu tenho uma action, e essa action acessa vários métodos de um facade e o facade acessa a DAO…
Atualmente, na action, quando eu instancio um facade, seu construtor instacia uma DAO que por sua vez pede uma conexao (via Hibernate) e armazena esse objeto em uma variável de classe, dai a action usa quantos métodos ela quiser usar usando apenas um único objeto de conexao.
O problema é que eu nao sei se isso é o mais indicado a se fazer…
Eu poderia pedir uma conexao para o pool de conexoes a cada método que a DAO executar , e fechar no próprio método…
Vejamos…
Quando a conexao é aberta logo na action (e fechada logo antes de sair dela) eu tenho um objeto para todos os métodos da DAO, porém, a conexao fica aberta pelo tempo que a action precisar…
Se eu abro uma conexao por método eu tenho vários objetos de conexao, porém, cada conexao fica aberto por um tempo menor…
e ai? um objeto e maior tempo ou vários objetos e menor tempo?
Cara, o preço de se conseguir um objeto do tipo Connection/Session é sempre caro e, ter vários objetos desse tipo carregados na mesma request
pode ser bastante caro para perfomance. O uso de um objeto único, filtros/interceptadores e um pool de conexões
(c3p0 http://www.mchange.com/projects/c3p0/index.html#hibernate-specific) seria o mais recomendado.Os filtros/interceptadores
garantiriam que conexões só seriam abertas se necessário, o pool reciclaria as conexões com o banco e seria bom injeção de
depêndencias pra tirar de sua classe a responsabilidade de instanciar um novo Dao.
Espero ter ajudado.
[]s
exato, é o que eu também penso, mas gostaria da opinião da comunidade…
voce citou sobre filtros, normalmente eu usaria o OpenSessionInView ( https://community.jboss.org/wiki/OpenSessionInView ) , mas tive empecilhos pra usar essa ideia dai eu passei a fazer da forma como eu descrevi acima, instanciando na action…
quanto ao C3P0 ele já é usado… antigamente usávamos o proxool, mas eu mudei para o C3P0 por que é o mais testado e usado e aparentemente tem mais recursos que o proxool
Que framework request-based vc tá usando? Dependendo de qual for posso te ajudar a implementar o open session in view.
Struts 1 … mas nem compensa mudar para o OSIV (open session in view), teria que mudar muita coisa, o sistema é relativamente grande e ainda tem uma parte que é webservice que é usado por mobiles… =/
estou só abrindo e fechando as conexoes nas actions e quando da erro a action manda um rollback pro facade e o facade repassa pra DAO… rsrs
Blz cara, mais dá uma olhada no Vraptor e no spring 3.
Olá amigo, não entendi muito bem o que vc gostaria de fazer mas vou dar uma dica.
Seguinte, se vc está falando em action, você deve estar usando um framework Action-based como Structs, Spring MVC, VRaptor etc…
Na minha opinião se você está trabalhando com action, não seria necessário você usar OpenSessionInView pois é na minha opinião mais indicado para frameworks component-based como jsf que usa e abusa da session.
Em se tratando de melhoria para acesso a dados hoje eu uso o C3P0 com jboss cache ou hibernate cache, pelo seguinte motivo:
C3P0 tem recursos de verificação failover, vc configura o tamanho do pool de conexao que vc quer e o ideal seria você usar um cache em segundo nivel caso uma determinada informação ou conjunto de informações seja acessado o tempo todo na aplicação poe exemplo um aplicação de vagas de estagio da faculdade ou vagas de emprego, aluguel, compra e venda, ecommerce, pois o tempo todo está inserindo informações e 5x mais essas informações são consultadas, com o C3P0 é possivel balancear as requisições entre as conexoes e com o cahe vc consegue otimizar a quantidade de consultas pois um determinado registro pode permanescer no cache pelo tempo que vc configurar, evitando um gargalo na base.
Ja com relação a arquitetura, c vc está usando c3p0 vc deve estar usando struts ou spring junto, pra vc conseguir aproveitar os recursos somados.
O que eu te indico seria, Struts(Action-based) + Spring(IOC e CDI) + Hibernate (+ hibernate-cache), em action based vc pode usar hqls com join para trazer osbjetos anotados como lazy, o que na minha opinião é melhor do que usar OpenSessionInView, pois de qualqur forma vc vai precisar dos atributos carregados no frontEnd e vc evita tb trafego na rede entre as tiers.OK
Fica a dica.