Conforme explicado nesta postagem do fórum , 1 e 2 estão relacionados. Se você configurar o hibernate.current_session_context_class
encadeamento e implementar algo como um filtro de servlet que abre a sessão - poderá acessar essa sessão em qualquer outro lugar usando o SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
sempre abre uma nova sessão que você deve fechar quando concluir as operações. SessionFactory.getCurrentSession()
retorna uma sessão vinculada a um contexto - você não precisa fechar isso.
Se você estiver usando Spring ou EJBs para gerenciar transações, poderá configurá-los para abrir / fechar sessões junto com as transações.
Você nunca deve usar one session per web app
- a sessão não é um objeto seguro para threads - não pode ser compartilhada por vários threads. Você sempre deve usar "uma sessão por solicitação" ou "uma sessão por transação"
openSession()
ouclose()
. Ele só ligagetCurrentSession()
. Eu acho que ele definecurrent_session_context
parathread
. Agora acho que entendogetCurrentSession()
. No entanto, não sei quando devo usaropenSession()
.Sessions
. Você pode me ajudar com isso em - stackoverflow.com/questions/23351083/… . Obrigado e chenqui.Se falamos sobre SessionFactory.openSession ()
E se falamos sobre SessionFactory.getCurrentSession ()
fonte
getCurrentSession
, reutilizaria a mesma sessão, não seria?openSession
: Quando você ligaSessionFactory.openSession
, ele sempre cria um novoSession
objeto e o entrega a você.Você precisa liberar e fechar explicitamente esses objetos de sessão.
Como os objetos de sessão não são seguros para threads, é necessário criar um objeto de sessão por solicitação no ambiente multithread e uma sessão por solicitação também em aplicativos da web.
getCurrentSession
: Quando você ligarSessionFactory.getCurrentSession
, ele fornecerá o objeto de sessão que está no contexto de hibernação e gerenciado internamente por hibernação. Está vinculado ao escopo da transação.Quando você liga
SessionFactory.getCurrentSession
, ele cria um novoSession
se não existir; caso contrário, use a mesma sessão que está no contexto de hibernação atual. Ele libera e fecha automaticamente a sessão quando a transação termina, para que você não precise fazer isso externamente.Se você estiver usando o hibernate no ambiente de thread único, poderá usá-
getCurrentSession
lo, pois seu desempenho é mais rápido em comparação à criação de uma nova sessão a cada vez.Você precisa adicionar a seguinte propriedade ao hibernate.cfg.xml para usar o
getCurrentSession
método:fonte
fonte
SessionFactory: "Um SessionFactory por aplicativo por DataBase" (por exemplo, se você usa 3 DataBases em nosso aplicativo, é necessário criar um objeto sessionFactory para cada banco de dados, é necessário criar totalmente 3 sessionFactorys. Ou se você tiver apenas uma sessão do DataBase One basta ).
Sessão: "Uma sessão para um ciclo de solicitação-resposta". você pode abrir a sessão quando a solicitação chegou e pode fechar a sessão após a conclusão do processo de solicitação. Nota: -Não use uma sessão para aplicativo da web.
fonte