hibernate, ThreadLocal e timeout  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

pesoal, estou com uma duvida cruel...

tenho uma aplicação webapp para gerenciamento de arrecadações.
neste, é feito o logon no sistema que espera o usuario lançar os dados.
geralmente o usuario loga e fica o dia interio, de 8h as 18h.

uso struts e hibernate.

as HttpSession estão numa boa, porem as Session do hibernate dão timeout.

usei ThreadLocal como recomendações do pesoal do proprio Hibernate
http://www.hibernate.org/42.html

uso a mesma session do hibernate para todos os usuarios, o que deixa o sistema muito mais rápido, porem a session está dando timeout e quando acesso objetos lazy, dá uma exceção.

alguem sabe o que fazer???
[Email] [WWW] [MSN] [ICQ]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Você usa a mesma session para todos os usuários???

Mas por quê?

O custo para se criar sessions é bastante leve, compensa mais você criar uma session para cada thead do sistema, ou melhor, para cada cliente ou usuário se assim preferir!

Utilizando uma session para todo mundo, como vc faz para controlar as tranzações, já que está todo mundo tranzando.. oops (tranzacionando..) no mesmo lugar???


Se vc está usando a implementação de TheadLocal sugeriada pelo pessoal do Hibernate, provavelmente vc está usando uma conexão para cada thead do sistema!

Abraços!
Thiago
[Email]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

Não faça isso, você está correndo o risco de estar usando dados inválidos. Use uma session por transação. Nunca vá além disso.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

está é a classe


ao iniciar o webapp é iniciado tambem a factory do hibernate.

quando é feito o primeiro acesso ao banco de dados uma session é aberta:



sempre que faço acessos a dados só uso os metodos select, insert, update e delete.
possuo tambem classes DAO, que fazem as regras de negocio, mas ao final sempre passa por aí.

o que ta acontecendo é que, nunca fecho e nem deconecto a session do hibernate, simplesmente vou usando os metodos. chega uma hora que dá erro de timeout no hibernate.

entendeu???
será que a forma que estou fazendo está correta?
[Email] [WWW] [MSN] [ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

Não está, você tem que fechar as session ao final de cada transação. >>transação<< e não comando.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

voce fala assim:

[Email] [WWW] [MSN] [ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

O normal é você fazer todas operações de um use case na mesma transação.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

minha webapp é em struts.

tenho uma action chamada PostAction que contem os controles básicos de acesso a dados.

existe tambem uma ActionForm chamada DBForm, com metodos que chamam o DAO correspondente a cada formbean.

por herança, define-se qual o objeto (tabela do banco) cada formBean corresponde.

no metodo execute da action (PostAction), eu verifico qual tipo de acesso (inserção, edição, remoção ou visualização) foi requerido pelo usuário, chama o metodo correspondente no form que acessa o banco de dados e efetiva a requisição (DAO -> Persistencia.insert()...).

isto tá funcionando muito bem.

não estou sabendo como trabalhar com transações dentro deste modelo.

podem me ajudar???
[Email] [WWW] [MSN] [ICQ]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá!

bom.. eu naum manjo muito desta parte...

dê uma olhada neste link aqui...
http://www.hibernate.org/hib_docs/reference/en/html/quickstart.html

e veja este exemplo de código da doc do hibernate...


Vc pode inicar sua transação com a chamada ao Transaction tx= session.beginTransaction(); e vc irá finalizá-la com o comando tx.commit();
. Provavelmente ai também deve ter o comando tx.rollback, ou algo do tipo.

Vc pode inicar a transação no início da sua action, e no final da action commite a transação, e se acontecer alguma exceção durante a execução da action, vc executa o rollback.

outra idéia interessante é vd usa filtros para inicar a transação e para inalizá-la. Assim, antes que inicie um action, a transação será iniciada, e ao terminar a execuão da action, caso o action tenha executado com sucesso, então dê commit, caso contrário, rollback!

Abraços!
Thiago
[Email]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

ok, valeu!!!

fiz os testes aqui e acontece o seguinte:
antes de iniciar a action eu abro uma transação e ao final fecho a transação porem quando a pagina jsp é montada dá uma exception:

isto é causado pelos relacionamentos lazy.
[Email] [WWW] [MSN] [ICQ]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

humm.. cruel hein..

eu naum manjo isso....

mas sugiro entaum q vc experimente não dar um commit na transação para ver se o erro persiste!

Se não persistir, entaum talvez vc solucione isso usando filttros...
http://www.guj.com.br/java.tutorial.artigo.11.1.guj


Abraços!
Thiago
[Email]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

se a session for fechada apos o processamento do JSP não ocorre erros.

usando filter, consigo pegar este evento?
porque ai eu posso fechar a session.



quando 'chain.doFilter(request, response);' é chamado o Servlet e o JSP são executados???
[Email] [WWW] [MSN] [ICQ]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

naum sei.. nunca fiz isso.. hehe..

faz o seguinte.. testa, e fala pra gente se funcou!

Tem alguns tópicos rodando esta semana que comentou sobre vc conseguir acessar os dados que estão persistidos no hibernate dentro de sua jsp...

[Email]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

fviana wrote:se a session for fechada apos o processamento do JSP não ocorre erros.

usando filter, consigo pegar este evento?
porque ai eu posso fechar a session.



quando 'chain.doFilter(request, response);' é chamado o Servlet e o JSP são executados???


Não faça assim, você não precisa criar uma sessão a cada request, você só precisa fechar a sessão (se ela foi criada) depois que tudo for executado.

Lá no desenrolar da execução da request, se for necessário, alguém vai criar uma sessão e vai botar ela na tread local.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
fviana
JavaChild
[Avatar]

Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline

entendi!!!

mas quando a session é fechada neste ponto

quer dizer que o JSP já foi montado?
[Email] [WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team