Session do hibernate na web  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
alots_ssa
JavaEvangelist

Membro desde: 19/07/2005 11:21:24
Mensagens: 469
Localização: Salvador
Offline

Galera, qual a melhor forma de abrir sessoes no hibernate em ambiente web. Abrir num filtro e usa essa mesma sessao em todos os casos. Ou ficar abrindo e fechando sempre que necessario. Outra coisa, a locaweb me disponibilizou um datasource com um pool que permite 5 conexoes simultaneas. Isso eh pouco como eu acho ou as excessoes de pool "exhausted" eram advindas de falhas minhas na manipulacao da sessao do hibernate?

Valeu,

Alberto

http://alots.wordpress.com
[WWW] [MSN]
Black_Pilot
Thread.start()

Membro desde: 28/03/2004 18:37:53
Mensagens: 25
Localização: Rio de Janeiro - RJ
Offline

alots_ssa wrote:Galera, qual a melhor forma de abrir sessoes no hibernate em ambiente web. Abrir num filtro e usa essa mesma sessao em todos os casos. Ou ficar abrindo e fechando sempre que necessario. Outra coisa, a locaweb me disponibilizou um datasource com um pool que permite 5 conexoes simultaneas. Isso eh pouco como eu acho ou as excessoes de pool "exhausted" eram advindas de falhas minhas na manipulacao da sessao do hibernate?

Valeu,

Alberto


Olha cara,

Eu tenho aberto a sessão, executado o comando e fechado a sessão. Mas isso por que eu parto do pré-suposto de que todos os meus comandos usarão banco de dados. Abrir e fechar uma sessão é uma operação barata, então não tem tanto problema.

O que eu recomendo é você colocar a sessão aberta numa ThreadLocal (sabe o que é isso? Eu não sabia até ler o livro do hibernate). Então, cada requisição http vai ter a sua própria sessão. Isso é bom pq a sessão possui um negócio chamado "cache de primeiro nivel". Ou seja, se vc pegar um objeto por um comando e, depois, com a mesma sessao mas em outra requisição, pegar o mesmo objeto, você vai pegar o objeto no cache e não no banco de dados. Isso pode acabar dando conflitos entre o banco e o seu programa.

Outra coisa é que se a sessão fechar por algum erro interno, seu sistema vai pras cucuias. Pq ele depende unicamente daquela sessão. Então, abrindo e fechando a sessão, se uma delas der erro, uma única requisição vai dar erro, mas o sistema continuará intacto.

5 Conexões é o suficiente, dependendo do caso. O Hibernate faz um pool de conexões, ou seja, ele mantém as conexões abertas e distrubui entre as sessões (esse é um dos papéis da SessionFactory).

Eu imagino que esse erro deve ser por que o hibernate está tentando aumentar o pool de conexões. Então, altere o arquivo de configurações do hibernate para usar apenas 5 conexões. Não lembro a propriedade exatamente, mas isso você acha fácil. Blz?

Boa sorte!

Pilot

Black Pilot - Estudante, estagiário, vagabundo e nas horas vagas admin do site Beco Diagonal.
[Email] [WWW] [MSN] [ICQ]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Você vai ter problemas com lazy collections se for ficar abrindo e fechando a session toda hora. O recomendado é a abordagem de filtro, abrindo no começo da requisição e fechando no final.
alots_ssa
JavaEvangelist

Membro desde: 19/07/2005 11:21:24
Mensagens: 469
Localização: Salvador
Offline

Black_Pilot, acho que o lance do pool do hibernate vc tem razao mesmo, ele vem por default um pool de 20 e eu nao modifiquei isso. Mas como tava dando esse erro e eu nao sabia pq adotei uma solucao forca bruta de abrir a conexao "natoralmente" e passa ela pa session do hibernate. Zeh, e se por acaso o usuari fechar o browser de repente, a sessao nao vai ficar aberta gastando a toa?

Alberto

http://alots.wordpress.com
[WWW] [MSN]
Black_Pilot
Thread.start()

Membro desde: 28/03/2004 18:37:53
Mensagens: 25
Localização: Rio de Janeiro - RJ
Offline

alots_ssa wrote:Black_Pilot, acho que o lance do pool do hibernate vc tem razao mesmo, ele vem por default um pool de 20 e eu nao modifiquei isso. Mas como tava dando esse erro e eu nao sabia pq adotei uma solucao forca bruta de abrir a conexao "natoralmente" e passa ela pa session do hibernate. Zeh, e se por acaso o usuari fechar o browser de repente, a sessao nao vai ficar aberta gastando a toa?

Alberto


Mas nessa sua solução, vc abre uma conexão por sessão? Não sei como se passa conexão para a sessão, por isso estou perguntando. Mas acho que seria uma boa você alterar a configuração e deixar o pool fazer o trabalho, não seria melhor?

Bom, só respondendo pelo Zeh, a sessão se fecha quando o processamento requerido pelo usuário terminar, com o usuário com o navegador aberto ou não isso vai acontecer. Então é garantido que a seção sempre será fechada no filtro.

Black Pilot - Estudante, estagiário, vagabundo e nas horas vagas admin do site Beco Diagonal.
[Email] [WWW] [MSN] [ICQ]
alots_ssa
JavaEvangelist

Membro desde: 19/07/2005 11:21:24
Mensagens: 469
Localização: Salvador
Offline

Eu li na documentacao do hibernate que pa vc usar ele com um datasource vc tem que pegar a conexao com o datasource e passar para ela como parametro no openSession. Pensando na mesma coisa fiz o esquema parecido abrindo a conexao e passando para ele.

Alberto

http://alots.wordpress.com
[WWW] [MSN]
andrefariagomes
JavaBaby
[Avatar]

Membro desde: 18/09/2004 11:10:06
Mensagens: 90
Offline

Alguém tem um exemplo de implementação com filtro?

Abraço,
André Faria
[Email] [WWW] [Yahoo!] [MSN]
cleriston
JavaGuru
[Avatar]

Membro desde: 06/02/2007 10:54:37
Mensagens: 234
Offline

Cara, vou reviver este post.

Dá uma olhada no link abaixo

http://www.hibernate.org/43.html
cleriston
JavaGuru
[Avatar]

Membro desde: 06/02/2007 10:54:37
Mensagens: 234
Offline

Vou aproveitar o tópico...

O que é um Session do Hibernate?
A cada openSession do SessionFactory é aberta uma conexão com o banco?
berdam
Thread.start()
[Avatar]

Membro desde: 04/04/2006 11:58:32
Mensagens: 30
Offline



A sessionFactory é a fábrica de session, seria mais especificamente a conexão com o banco de dados. Ela é aberta no início e no fim da aplicação. Sua abertura e fechamento consome muitos recursos, já a session não consome muitos recursos e é aberta toda vez que alguma operação envolvendo select é executada.
[WWW]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team