2012-08-22 14 views
5

Po tym, jak moje zapytania (odnośniki) zostają zbuforowane, sesja zostaje zamknięta, w nowej sesji hibernacja eksmituje wszystko po zmianie DB przez losowe zapytanie SQL, jak mogę to zatrzymać? wydarzenie ? Zajmuję się tworzeniem zasad dla rzeczy, które rzadko się zmieniają.hibernacja cache hibernacji hibernacji, hibernacja eksmituje się automatycznie

INFO Executing [namedSqlQuery=dao.web_login, objs=[user1]] 
DEBUG org.springframework.orm.hibernate3.SessionFactoryUtils user1- Opening Hibernate Session 
DEBUG org.hibernate.impl.SessionImpl user1 - opened session at timestamp: 5511432318976000 
DEBUG org.hibernate.impl.SessionFactoryImpl user1- evicting second-level cache: USERS_LOOKUP 
DEBUG org.hibernate.impl.SessionFactoryImpl user1- evicting second-level cache: COUNTRY_LOOKUP 

ecache.xml

<cache name="query.oneHourPolicy" 
      maxElementsInMemory="10000" 
      eternal="false" 
      timeToLiveSeconds="3600" 
      diskPersistent="true" 
      overflowToDisk="true"/> 

konfiguracja sprężyny hibernacji

<prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop> 
       <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop> 
+0

Czy Twój CacheMode jest ustawiony jako REFRESH (np. CacheMode.REFRESH) – Santosh

+0

Nie, napisałem klasę junit, aby uruchamiać te same zapytania w tej samej sesji bez losowego SQL pomiędzy i przechodzi od 20 sekund do 1 sekundy, aby uzyskać odpowiedź. – Rodriguez

+0

JUnit log 0st time - 20134 ms 1 raz - 207 ms 2-gi czas - 183 ms 3-gi czas - 179 ms 4-ty czas - 185 ms z losowym zapytaniem sql 5-ga czas - 20043 ms 6-sza sekunda - 182 ms 7-ga czas - 181 ms 8-ga czas - 177 ms - 9-ta godzina - 179 ms – Rodriguez

Odpowiedz

3

znaleźć hibernacji Problem https://hibernate.onjira.com/browse/HHH-2224

testowanego z mieszkiem:

w moim losowej zapytania

<sql-query name="random_write_query" callable="false"> 
     <synchronize table="USER"/> 
     <synchronize table="USER_ADDRESS"/> 
     {CALL PACKAGE.FUNCTION(?)} 
</sql-query> 

gdy nazywam powyżej i jest to zmiana DB będzie unieważnić tylko cache zsynchronizowane przez stół = user lub USER_ADDRESS

i tylko zostaną wydaleni zsynchronizowane losowe zapytania odczytu lub podmioty

<sql-query name="random_read_query"> 
     <synchronize table="USER"/> 
     <synchronize table="USER_ADDRESS"/> 
     <return-scalar column="USERNAME" type="string"/> 
     <![CDATA[ 
      SELECT USERNAME FROM USER, USER_ADDRESS... 
     ]]> 
    </sql-query>