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:
- Uruchomienie serwera w konfiguracji
all, - Uruchomienie serwera w konfiguracji
defaultpo 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.




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.
Service z jbossCache staruje ale w consoli jmx nie widac zadnej cacheowanej encji.
fresh,
Ustawiając parametr
hibernate.cache.use_second_level_cachenafalsewyłączasz używanie pamięci podręcznej, również dla encji. Parametr ten musi być ustawiony natrue. Pamięć podręczna dla zapytań może być wyłączona.Zmień ten parametr i spróbuj ponownie. Dlaczego go wyłączyłeś?
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”
@fresh,
Pokaż zawartość pliku
persistence.xml. Pokaż logi z zapytań.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.
Tak jak mówisz, pola oznaczone
@Transientnie są zapisywane w pamięci podręcznej.Znalezione w sieci:
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
Myślę, że warto zajrzeć również tutaj oraz tutaj. Zauważ, że są to dwie różne adnotacje, nie wiem której używasz.
Przyznam się, że tego kawałka o
@Transientw Pro EJB nie do końca rozumiem.