Hibernate: проблема с включением кэша второго уровня - PullRequest
1 голос
/ 28 июня 2011

Я использую Hibernate 3.3.4.GA. В нашем файле hibernate.cfg.xml мы указываем…

    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.provider_configuration">classpath:ehcache.xml</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.use_sql_comments">true</property>
    <property name="hibernate.generate_statistics">true</property>
    <property name="hibernate.cache.use_structured_entries">true</property>

Но выполнение теста с БД (из JUnit) приводит к счету пропусков, равному нулю, и количеству пропусков, равному нулю, что полностью запутывает

@Test
public void testCache() {
    final String cacheRegion = WebLead.class.getCanonicalName();
    final SecondLevelCacheStatistics settingsStatistics = sessionFactory.getStatistics().getSecondLevelCacheStatistics(cacheRegion);

    // Make first query.
    webLeadsDAO.getLeads(lead);
    System.out.println("miss count:" + settingsStatistics.getMissCount());
    System.out.println("hit count:" + settingsStatistics.getHitCount());

    // Make second query, expect this to hit cache.
    webLeadsDAO.getLeads(lead);
    System.out.println("after second query, hit count: " + settingsStatistics.getHitCount());
}

Ниже приведен метод, который мы используем для получения результатов. Любые идеи, почему и количество пропусков, и число попаданий будут равны нулю?

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Table(name="LEAD")
public WebLeads getLeads(WebLead webLead) {
    final Session session = sessionFactory.openSession();
    final Criteria crit = session.createCriteria(WebLead.class);
    crit.setCacheable(Boolean.TRUE);

    // Find webLeads matching input
    crit.add( Example.create(webLead) );
    // Make special exception for primary key since that isn't covered by Example.create
    if (webLead.getLEAD_ID() != null) { 
        crit.add(Restrictions.eq("LEAD_ID", webLead.getLEAD_ID()));
    }   // if

    @SuppressWarnings("unchecked")
    final List<WebLead> results = crit.list();
    final WebLeads webLeads = new WebLeads();
    webLeads.addAll( results );

    session.close();
    return webLeads;
}

Ясно, что кеш не включен, но я не могу понять, почему. - Дэйв

Ответы [ 2 ]

0 голосов
/ 26 ноября 2012

Вы используете Hibernate 3.3.4, но настраиваете cache.provider_class для pre 3.3 Hibernate.

Проверьте эту ссылку для более подробной информации: http://ehcache.org/documentation/user-guide/hibernate

0 голосов
/ 28 июня 2011

Пожалуйста, проверьте мой ответ здесь для рабочей конфигурации кэша второго уровня:

Конфигурация кэша второго уровня

Надеюсь, это поможет.

UPDATE:

Попробуйте это:

Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
SecondLevelCacheStatistics cacheStats = stats.getSecondLevelCacheStatistics(cacheRegion);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...