Session do hibernate na web

9 respostas
A

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

9 Respostas

B

alots_ssa:
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? :wink:

Boa sorte!

Pilot

Z

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.

A

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

B

alots_ssa:
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.

A

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

andrefariagomes

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

cleriston

Cara, vou reviver este post.

Dá uma olhada no link abaixo

http://www.hibernate.org/43.html

cleriston

Vou aproveitar o tópico…

O que é um Session do Hibernate?
A cada openSession do SessionFactory é aberta uma conexão com o banco?

berdam

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.

Criado 28 de abril de 2006
Ultima resposta 25 de nov. de 2008
Respostas 9
Participantes 6