OpenSessionInView em sistemas desktop  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
fabiofalci
GUJ Master
[Avatar]

Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline

Boa tarde pessoal.
Tenho uma app desktop, feita em swing que acessa o sistema em um AS.

Na view acessamos o server atrás dos objetos para mostrar na tela.
(ok, eu sei que estou ferindo leis... http://www.guj.com.br/posts/list/133052.java#716596 )

O caso é esse acesso está ficando chato de fazer, em cada um precisamos dizer quais
relacionamentos do objeto precisam ser 'acordados' (fetch) senão estoura um LazyInitiationException do
hibernate. Esse código está se tornando em um monte de array de String com o nome do atributo
a ser acordado, e muitas vezes é mais de um nivel...

Então pensei no tal OpenSessionInView, mas o caso é que a view está em outra
máquina, o acesso é remoto, então não dá pra forçar a barra do hibernate e pedir pra ele abrir
a session. Minha esperança é conseguir mudar isso, ao invés do hibernate abrir a session,
customizar e acessar um Facade da minha aplicação por exemplo, que vai até o server, faz a consulta
e retorna. Assim quando ocorrer o get, esse código vai executar e buscar esse dados
sob demanda.

Alguém já teve experiência nisso? Opiniões sobre esta estratégia?

Valeu!
[WWW] [MSN] [ICQ]
pozzo
JavaEvangelist

Membro desde: 08/04/2006 11:07:20
Mensagens: 331
Localização: Curitiba
Offline

Bom, a minha opinião é a de evitar eager loading. Busque novamente quando precisar de algo. Ou carregue os relacionamentos que você vai utilizar (com cautela).

Como as aplicações desktop tem "menos controle" e mais interações do usuário (ao meu ver), acho que a performance pode cair muito caso você dê muita liberdade no cliente, e esses carregamentos automáticos.

Mas outra idéia, que me veio agora, foi a de abrir e fechar a sessão na thread (com ThreadLocal). De forma análoga ao OSIV web, que funciona abrindo a sessão no inicio da request e fechando ao fim da request.

This message was edited 1 time. Last update was at 02/09/2009 16:45:17

fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1534
Localização: Terra (maior parte do tempo)
Offline

Se entendi, acho que passei por coisa parecida.

Éra utilizado o spring para fazer a comunicação com o servidor e muito a contra gosto não utilizamos o lazyloading a favor de um código mais limpo e menos insano. É um pouco chato de montar alguma estratégia porque ao fazer o acesso não éra criado uma sessão no server.

Sua idéia (uma espécie de business delegate esperto, é isso?) parece bacana mas pode dar um pouco de trabalho, seria um desafio interessante.

flws
fabiofalci
GUJ Master
[Avatar]

Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline

Quero evitar coisas como:


Sendo que alguns fetches são usados em componentes 'lookups'. Se não forem
abertos não serão usados.

A ideia é seguir isso:
http://www.theserverside.com/tt/articles/article.tss?l=RemoteLazyLoadinginHibernate

Ou seja, no primeiro acesso a propriedade (pode ser lista ou referência) busco do banco, na próxima vez não. Assim não
recarrego toda hora e busco somente o que for usado. O que pode acontecer é que uma abertura de
'lookup' poder ficar mais devagar pois vai acontecer a consulta. Mas a abertura da tela vai ficar mais
rápida pois não carrega tudo. Podemos até balancear isso, o que for mais usado faço antes da abertura
da tela e o restante sob demanda.
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team