Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Отслеживание использования кэша hibernate


Автор: Grelloo 27.4.2006, 17:39
Надо определить используется second-level кэш hibernate или нет.
Я использую кэш провайдер ehcache для кэширования hibernate. Чтобы определить использовался ли кэш или нет, я могу заглянуть в логи, но мне дали задание наглядно показать, что объект кэшируется посредством second-level cache (для учебных целей).
То бишь надо показать, что если используется first-level cache, то объект извлекается каждый раз из базы данных (если это не внутри одной транзакции), а при использовании second-level cache объект первый раз извлекается из базы и кладется в кэш, а при повторном вызове просто берется из кэша, не обращаясь к базе. 
Как это можно сделать? 

Автор: tux 28.4.2006, 01:49
Загляни в javadoc ehcache - http://ehcache.sourceforge.net/apidocs/index.html. Последовательность действий может быть такой:
  • получаем экземпляр класса net.sf.ehcache.CacheManager, вызывая у него же статический метод getInstance()
  • от класса net.sf.ehcache.CacheManager получаем список существующих кэшей методом getCacheNames(), выбираем из списка тот, что нужно. Думаю он будет всего один, хотя кто его знает как Hibernate EhCache использует. В конце концов можно поискать во всех кэшах
  • получаем по имени нужный кэш методом getCache()
  • смотрим в логи или в дебаггере в сам кэш и наблюдаем какие ключи Hibernate дает кэшируемым объектам
  • задаем ключ для поиска объекта таким же макаром и ищем объект, вызывая у кэша метод get() и передавая ему в качестве параметра ключ.
Вроде все. 

Автор: Grelloo 3.5.2006, 14:42
Написал следующий код:
Код

private static void listHoney() {
        
        Transaction tx = null;
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        try {

            tx = session.beginTransaction();
            List honeys = session.createQuery("select h from Honey as h")
                    .list();
            for (Iterator iter = honeys.iterator(); iter.hasNext();) {
                Honey element = (Honey)iter.next();
            String[] g = CacheManager.getInstance().getCacheNames();
                for (int i = 1; i < g.length; i++){
                    System.out.println(g[i]);
        CacheManager.getInstance().getCache(g[i]).get("de.laliluna.example.Honey#2"); 
                } 
                log.debug(element);
            }
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            if (tx != null && tx.isActive())
                tx.rollback();

        }
    }

В логах выбрасывает следующее: 
Код

17:20:53,237 DEBUG CacheManager:290 - Attempting to create an existing singleton. Existing singleton returned.
example.Honey

То бишь как я понял example.Honey - это имя кэша, который я использую
По поводу ключа получаю следующее 

Код

17:24:15,249 DEBUG Cache:1242 - de.laliluna.example.Honey: Is element with key de.laliluna.example.Honey#2 expired?: false

Я вписал его в метод get()
В конце концов он пишет

Код

17:31:27,360 DEBUG MemoryStore:137 - example.HoneyCache: example.HoneyMemoryStore miss for de.laliluna.example.Honey#2
17:31:27,360 DEBUG Cache:557 - example.Honey cache - Miss




 

Автор: tux 4.5.2006, 03:01
Так ничего не выйдет. Видишь ли, Hibernate в качестве ключей использует не строки, а классы org.hibernate.cache.CacheKey (это можно было узнать, напечатав класс ключа). Следовательно и искать в кэше надо создавая экземпляры этих классов поскольку equals() для разных классов заведомо вернет false.

Вот так вот прекрасно работает:
Код

private boolean isInCache(Honey honey) throws CacheException {
    CacheKey key = new CacheKey(honey.getId(), Hibernate.INTEGER, 
            Honey.class.getName(), EntityMode.POJO, null);
    CacheManager manager = CacheManager.getInstance();
    Cache cache = manager.getCache(honey.getClass().getName());
    if (cache.get(key) != null)
        return true;
    else
        return false;
}
  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)