Posted by: Marek Goldmann on: 15/11/2008
Aby scacheować encję w serwerze JBoss należy opatrzyć ją adnotacją @org.hibernate.annotations.Cache:
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Table(name = "role_permissions")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class RolePermission extends BaseEntity {
private static final long serialVersionUID = 6778357970340362708L;
private String role;
private String target;
...
}
oraz dodać odpowiednie właściwości do pliku persistence.xml:
<property name="hibernate.cache.provider_class" value="org.jboss.ejb3.entity.TreeCacheProviderHook" /> <property name="treecache.mbean.object_name" value="jboss.cache:service=EJB3EntityTreeCache" />
Dodatkowo należy posiadać odpowiednio skonfigurowany serwer. Są na to dwa sposoby:
all,default po jej uprzednim przygotowaniu.Drugi sposób jest o tyle lepszy, że jest start serwera jest zdecydowanie szybszy, co na maszynie deweloperskiej jest dużym atutem. Konfiguracja all pozwala na klastrowanie, ale komu to potrzebne przy tworzeniu i testowaniu aplikacji?
Aby uruchomić cacheowanie encji przy konfiguracji default (domyślnej) należy skopiować z katalogu $JBOSS_HOME/server/all/lib/ biblioteki jboss-cache-jdk50.jar oraz jgroups.jar do katalogu $JBOSS_HOME/default/lib/.
Dodatkowo należy skopiować plik $JBOSS_HOME/server/all/deploy/ejb3-entity-cache-service.xml do katalogu $JBOSS_HOME/default/deploy/.
I to wszystko – możemy już cieszyć się encjami z pamięci podręcznej.
Poprawność uruchomienia cacheowania można sprawdzić w konsoli JMX serwera JBoss pod adresem http://localhost:8080/jmx-console/ wyszukując usługę *:service=EJB3EntityTreeCache,*, a następnie uruchamiająć akcję printDetails(). Na wynikowym ekranie powinna się znaleźć encja oznaczona adnotacją @Cache.
Service z jbossCache staruje ale w consoli jmx nie widac zadnej cacheowanej encji.
Ustawilem w persistence unit hibernate.cache.use_second_level_cache na true oraz na encjach adnotacje @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) ale nadal leca zapytania przy kolejnym odwolaniu do encji.
Odezwij sie do mnie na maila “yazoo22 malpa o2 kropka pl”
Cześć,
mam pytanie dotyczące zachowania pól oznaczonych @Transient, czy one też są zapamiętywane w cache ?
Przeprowadzałem małe testy, i gdy chciałem odczytać wartość tego pola zawsze dostawałem nulla.
Dzięki za tak szybką odpowiedź.
http://books.google.pl/books?id=fVCuB_Xq3pAC&printsec=frontcover&dq=pro+ejb+3&ei=KkhwSoLwNYmGzASGu6zdDg#v=onepage&q=&f=false
Na 82 stronie tejże książki jest napisane (przynajmniej tak mi się wydaje :) ) że w odróźnieniu od javowego słowa kluczowego transient, adnotacja @Tranisent powoduje że zmienna jest serializowana
30/12/2008 @ 14:40
Wajny tutek,
Niestety u mnie chyba to za bardzo nie dziala.
Zrobilem wszystko jak napisales plus dodatkowo musialem wylaczyc second level cache oraz query cache w hibernate
No i wszystko niby dziala, ale za kazdym razem gdy wywoluje metode, ktora odpytuje encje (to samo zapytanie) widze ze logi hibernata nadal leca, czyli zapytania do bazy ida.
Nie wiem jak moglbym jeszcze to skonfigurowac aby dane byly cachowane.