Única session para todo o sistema

67 views
Skip to first unread message

Fernando Santos

unread,
Oct 19, 2011, 9:29:27 PM10/19/11
to hibernat...@googlegroups.com
Olá,

Estou desenvolvendo uma aplicação e tenho passado por alguns problemas devido ao lazy fetching...

Antes eu não estava fechando nenhuma session, mas aí começei a ter problemas em algumas operações, por ter mais de uma session aberta e tal.
Então eu mudei a estratégia e fechei todas as session após usar mas tive problemas com  LazyInitiatializationException porque as vezes eu acessava atributos de um objeto cujo a session dele ja tinha sido fechada..

Aí agora eu fiz o seguinte: Transformei a minha HibernateUtil para só ter uma instância (tipo um Singleton), e pra ela só gerar 1 session também. Ou seja, sempre que eu der um getSession() de algum lugar do meu código ele executa o seguinte:

public Session getSession() {
if (session == null) {
session = factory.openSession();
}
return session;
}

Dessa forma, o meu sistema inteiro só trabalhará com uma única session. Isso é uma boa estratégia? Será que isso pode deixar o sistema lento ou algo do tipo? O que vocês acham?

Obrigado,

--
Fernando Santos
(61) 8129-8505

Oscar Costa

unread,
Oct 21, 2011, 6:27:04 AM10/21/11
to Hibernate Brasil
Só uma pergunta para responder a todas as suas: Seu sistema possui
apenas 1 usuário e é single thread?

Agora o que você deveria fazer:

Se você possuir uma Fachada, seria interessante abrir e fechar a
sessão nela, estabelecendo o controle da sessão em apenas um ponto.
Então, sobre os "lazy loading" você poderia carregar tudo o que
necessita antes de fechar a sessão.Creio que esta é a abordagem mais
simples, já que não tenho nenhum conhecimento da arquitetura da sua
aplicação.

[]s,

Oscar.

On 19 out, 23:29, Fernando Santos <fernandoleandro1...@gmail.com>
wrote:
> Olá,
>
> Estou desenvolvendo uma aplicação e tenho passado por alguns problemas
> devido ao lazy fetching...
>
> Antes eu não estava fechando nenhuma session, mas aí começei a ter problemas
> em algumas operações, por ter mais de uma session aberta e tal.
> Então eu mudei a estratégia e fechei todas as session após usar mas tive
> problemas com  LazyInitiatializationException porque as vezes eu acessava
> atributos de um objeto cujo a session dele ja tinha sido fechada..
>
> Aí agora eu fiz o seguinte: Transformei a minha HibernateUtil para só ter
> uma instância (tipo um Singleton), e pra ela só gerar 1 session também. Ou
> seja, sempre que eu der um getSession() de algum lugar do meu código ele
> executa o seguinte:
>
> * public Session getSession() {*
> * if (session == null) {*
> * session = factory.openSession();*
> * }*
> * return session;*
> * }*

Fernando Santos

unread,
Oct 21, 2011, 12:12:10 PM10/21/11
to hibernat...@googlegroups.com
Então, é um sistema desktop de controle de estoque. Então sempre só tem um usuário logado e só possui 1 instância do sistema sendo executada. Acho que pra esse caso essa solução de usar 1 session sempre funciona legal então né?



2011/10/21 Oscar Costa <oscar...@gmail.com>
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Hibernate Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para hibernat...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para hibernate-bras...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/hibernate-brasil?hl=pt-BR.

Suporte

unread,
Oct 21, 2011, 3:24:37 PM10/21/11
to hibernat...@googlegroups.com

Dentro da sua classe que gera a conexão do Hibernate (Session).

Anota ela como @ScopedAplication

 


edipo...@gmail.com

unread,
Oct 21, 2011, 4:16:39 PM10/21/11
to hibernat...@googlegroups.com
Fernando,

Apesar de ser uma aplicação que será utilizada por um único usuário, não recomendaria manter a sessão aberta. O ideal seria abrir e fechar a conexão dentro de uma transação.

Quando à exceção, ou você carrega tudo que precisa, como o Oscar sugeriu, ou recarrega os objetos ao processar a transação.

Fica complicado explicar esta última, mas pense que no seu programa tem um "selectItem" que tem um ID e uma descrição de um objeto com atributos lazy. Você passa o ID do item selecionado para seu objeto e ao chegar o outros atributos, recarrega-o. Não sei se consegui me fazer entender.

2011/10/19 Fernando Santos <fernandol...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Hibernate Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para hibernat...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para hibernate-bras...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/hibernate-brasil?hl=pt-BR.



--

    Abraços,
    Édipo E.  F.  de Melo

Fernando Santos

unread,
Oct 21, 2011, 4:26:46 PM10/21/11
to hibernat...@googlegroups.com
Ah, entendi mais ou menos..

O que eu não consigo executar é que por exemplo, eu faço a busca de um Usuario, aí fecho a session assim que faço a busca. Aí depois durante a execução, eu tento executar por exemplo Usuario.getPedidos() aí ele sempre me da a exception  LazyInitiatializationException, porque a session que me retornou o Usuario já está fechada.. aí como eu resolvo esse problema?




--
Fernando Santos
(61) 8129-8505

Fernando Santos

unread,
Oct 21, 2011, 4:14:54 PM10/21/11
to hibernat...@googlegroups.com
o que isso faz?

2011/10/21 Suporte <sup...@softhouse.inf.br>
Reply all
Reply to author
Forward
0 new messages