Fiz alguns testes de cache no Hibernate usando o Apache JCS e verifiquei que dentro da mesma Session, carregando uma instância atravéz de Session.load() e comparando-as com == retorna false.
Pelo que eu vi no manual do Hibernate, a instancia deveria ter sido cacheada na primeira chamada a load, portanto a segunda chamada a load deveria retornar a mesma instancia que a primeira, dessa forma o == seria true.
Estou usando <jcs-cache usage=“read-only”/> e usando o arquivo cache.ccf padrão que vem na instalação do Hibernate.
O objeto que estou usando para testes é bem simples, tem apenas 2 campos, um de codigo e outro de descrição.
O que estou fazendo de errado ?
Ou será que o funcionamento da cache JCS naum é assim ?
deveria retornar true:
TeamVO team1 = (TeamVO) session.load(TeamVO.class,new Long(1));
TeamVO team2 = (TeamVO) session.load(TeamVO.class,new Long(1));
System.out.println(team1 == team2); // true
tem certeza que o objeto é o mesmo que está no cache?
coloca o código aqui para agente ver…
vc pode testar se o objeto está no cache através do método “contains” de Session
Implementei na classe do objeto os metodos equals e hashCode para ver no que dava e funcionou ( o q não tem nada a ver, pois depois tirei a implementação e continuou funcionando… ).
Bem, na mesma Session está ok, mas em Sessions separadas continua dando false no ==, como fazer para manter esta cache cross-sessions ( gostaram do cross-sessions ? ), pois é este o comportamento que desejo em objetos read-only.
[quote=“CLAUDIO GUALBERTO”]Implementei na classe do objeto os metodos equals e hashCode para ver no que dava e funcionou ( o q não tem nada a ver, pois depois tirei a implementação e continuou funcionando… ).
[/quote]
estranho
bem, aí já não sei te responder, pois se você fechar a Session uma nova instância será criada, e o resultado será false.
isto até faz sentido, pois uma Session representa uma Transação, e quando a transação acaba, pode ser que seus objetos tenham sido alterados, então na próxima session o Hibernate acessaria a base novamente para atualizar o “cache”…
mas se vc definiu como read-only esqueça o que eu falei porque deixa de fazer sentido, sendo que vc não vai alterar o objeto
eh o que o Ricardo falou.
se houvesse cache, em um lguar que existe a possibilidade de escrita, voce poderia ver o objeto no estado transacional (dirty read, em termos de BD). isso nao eh legal.
mas seria interessante se, no hibernate, a gente pudesse avisar que aquele objeto que estamos mexendo era readonly, fazendo com que o cache fosse “cross sessions”, como voce falou la em cima.
É exatamente o que os entity beans read-only fazem. No JBoss usando commit-type A, uma instancia é lida do BD somente uma vez para todas as transações, salvo em situações onde a instância é passivada, mas acho que o JBoss ( e a maioria dos AppServers ) não passivam entity beans com commit-type A.
Não existe uma forma de se atingir isso usando Hibernate ?
Se realmente não existe, qual seria o problema de manter uma Session sempre aberta para aproveitar esta cache ? ( além do problema de connection pooling )