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?
[quote=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[/quote]
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?
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.
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?
[quote=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[/quote]
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.
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.
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.