2013-01-01 24 views
1

我使用Spring 3.1.1.RELEASE,Hibernate 4.1.5.Final和JUnit 4.8.1。我想測試我的二級緩存是否正確使用,但不確定我是否正確使用。下面的JUnit代碼失敗在最後斷言......爲什麼我在第二級緩存中沒有獲得成功?

private Statistics m_stats; 

@Before 
public void setup() 
{ 
    m_stats = ((org.hibernate.internal.SessionImpl) m_entityManager.getDelegate()).getSessionFactory().getStatistics(); 
} // setup 

@Test 
public void testGenerateStats() 
{ 
    final String countryId = m_testProps.getProperty("test.country.id"); 
    final Country country = m_countryDao.findById(countryId); 
    Assert.assertNotNull(country); 

    final Country country2 = m_countryDao.findById(countryId); 
    m_countryDao.findById(countryId); 
    Assert.assertTrue(m_stats.getSecondLevelCacheHitCount() > 0); 
} 

這是我如何配置我的域對象...

@Entity 
@Table(name = "cb_country") 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
public class Country implements Serializable 
{ 
    … 
} 

,這裏是我的DAO ...

@Override 
public Country findById(String id) 
{ 
    Country ret = null; 
    if (id != null) 
    { 
     ret = entityManager.find(Country.class, id); 
    } // if 
    return ret; 
} 

這裏是我如何配置我的休眠二級緩存...

<!-- Caching --> 
    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
    <!-- Collect stats, this is for testing if the cache is working --> 
    <property name="hibernate.generate_statistics">true</property> 

任何想法爲什麼我的二級緩存沒有顯示任何命中?謝謝 - 戴夫

+0

第一條評論:有一個更好的方法從'EntityManager'獲取'Statistics'對象,不需要將其轉換爲Hibernate內部對象。看到我的代碼在你的另一個問題:http://stackoverflow.com/questions/14106575/how-do-i-access-hibernate-statistics-from-an-entitymanager –

+1

第二評論:你看到的命中數對應於從'org.hibernate.stat。*'調試消息,即Hibernate(或可能Ehcache)調試消息揭示爲什麼沒有緩存命中?有時會有緩存命中,但它們被認爲已過期。 –

+0

我沒有看到任何帶有「org.hibernate.stat」的調試消息。我問的是爲什麼不生成二級緩存命中?我得到同一個實體兩次。 – Dave

回答

0

現在有點老了,但如果你設置你的日誌記錄來顯示休眠統計信息,如Marcel Stör說 - 例如,

log4j.logger.org.hibernate.stat=TRACE

手錶這樣的事情

DEBUG 2013年10月4日11:09:20456 [主] org.hibernate.stat.internal.StatisticsInitiator:統計初始化[啓用=假]

我看你有沒有hibernate.generate_statistics=true

然而,讓剛剛在我的統計測試我使用:

m_stats.setStatisticsEnabled(true);

我有一個測試,我認爲說明了這一點被默認在4.1.7版本啓用,但在那之後(我升級到4.1.12,和我的緩存測試中的某個時候改變失敗),所以我不確定爲什麼它在4.1.5版本中沒有啓用,但是讓統計日誌記錄工作知道肯定。

2

SecondLevelCacheHitCount等於零,因爲在會話期間(和你的代碼一樣),hibernate使用一級緩存並從中加載實體。二級緩存未使用,因此secondLevelCacheHitCount未更改。

相關問題