2010-11-15 11 views
8


Moja aplikacja java prosi serwer mysql o zapytanie co 10 sekund.
Ręcznie wstawiam do tabeli nowy wiersz.
I hibernacja nie może go znaleźć.
Również po ręcznym usunięciu wiersza Hibernate pokazuje, że ten wiersz istnieje.
Sugeruję, że dzieje się tak, ponieważ buforowanie w trybie hibernacji.
Czy jest jakiś sposób, aby wyłączyć to w ogóle?
Dziękujemy!Jak wyłączyć całkowicie buforowanie w trybie hibernacji? (ze Spring 3, Hibernate z adnotacjami)

Odpowiedz

11

Czy masz na myśli pamięć podręczną pierwszego poziomu lub pamięć podręczną drugiego poziomu? Posiadanie pamięci podręcznej drugiego poziomu, takiej jak Ehcache, która buforuje elementy odpowiadające wierszom w tej samej tabeli, które modyfikujesz ręcznie, może spowodować zachowanie, które opisujesz. Pamięć podręczna pierwszego poziomu nie spowodowałaby takiego zachowania i nie sądzę, żeby i tak można ją wyłączyć.

Aby wyłączyć pamięć podręczną drugiego poziomu hibernacji, usuń z pliku konfiguracyjnego hibernacji, hibernate-cfg.xml, wszystkie wiersze odnoszące się do pamięci podręcznej drugiego poziomu. Na przykład:

<!-- Enable the second-level cache --> 
<property name="hibernate.cache.provider_class"> 
    net.sf.ehcache.hibernate.EhCacheProvider 
</property> 
<property name="hibernate.cache.region.factory_class"> 
    net.sf.ehcache.hibernate.EhCacheRegionFactory 
</property> 
<property name="hibernate.cache.use_query_cache">true</property> 
<property name="hibernate.cache.use_second_level_cache">true</property> 
<property name="hibernate.cache.use_structured_entries">true</property>  
<property name="hibernate.cache.generate_statistics">true</property> 
+0

Cześć Derek, dzięki lub twoje odpowiedzi! Hm, wygląda na to, że nie mam buforowania na drugim poziomie, może spróbuję usunąć pierwszy poziom? Jak mogę to zrobić? – gennad

+0

Z tego co wiem, nie można wyłączyć pamięci podręcznej pierwszego poziomu, ale zgodnie z http://stackoverflow.com/questions/3943366/how-can-i-configure-hibernate-to-immediately-apply-all- save -updates-and-delete/3946939 # 3946939, Spring może umożliwić szybkie płukanie pamięci podręcznej pierwszego poziomu, co może skutecznie osiągnąć ten sam wynik. –

-1

można wykorzystać hints.put ("javax.persistence.cache.retrieveMode" CacheRetrieveMode.BYPASS); w metodzie persist() może działać.

1

Aby "spróbować" wyłączyć pamięć podręczną pierwszego poziomu, eksmituję ją za każdym razem, gdy żąda się EntityManager. pracował dla mnie;)

public EntityManager getEntityManager(){ 
     if(emf == null){ 
      if (parameters == null) { 
       emf = Persistence.createEntityManagerFactory(persistenceUnitName); 
      } else { 
       emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters); 
      } 
     } else { 
      emf.getCache().evictAll(); 
     } 

     EntityManager em = emf.createEntityManager(); 
     return em; 
    } 
+1

Dzięki, to zadziałało dla mnie. – CrushedPixel

Powiązane problemy