Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отслеживание использования кэша hibernate 
:(
    Опции темы
Grelloo
Дата 27.4.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Надо определить используется second-level кэш hibernate или нет.
Я использую кэш провайдер ehcache для кэширования hibernate. Чтобы определить использовался ли кэш или нет, я могу заглянуть в логи, но мне дали задание наглядно показать, что объект кэшируется посредством second-level cache (для учебных целей).
То бишь надо показать, что если используется first-level cache, то объект извлекается каждый раз из базы данных (если это не внутри одной транзакции), а при использовании second-level cache объект первый раз извлекается из базы и кладется в кэш, а при повторном вызове просто берется из кэша, не обращаясь к базе. 
Как это можно сделать? 
PM MAIL ICQ   Вверх
tux
Дата 28.4.2006, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Загляни в javadoc ehcache - http://ehcache.sourceforge.net/apidocs/index.html. Последовательность действий может быть такой:
  • получаем экземпляр класса net.sf.ehcache.CacheManager, вызывая у него же статический метод getInstance()
  • от класса net.sf.ehcache.CacheManager получаем список существующих кэшей методом getCacheNames(), выбираем из списка тот, что нужно. Думаю он будет всего один, хотя кто его знает как Hibernate EhCache использует. В конце концов можно поискать во всех кэшах
  • получаем по имени нужный кэш методом getCache()
  • смотрим в логи или в дебаггере в сам кэш и наблюдаем какие ключи Hibernate дает кэшируемым объектам
  • задаем ключ для поиска объекта таким же макаром и ищем объект, вызывая у кэша метод get() и передавая ему в качестве параметра ключ.
Вроде все. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Grelloo
Дата 3.5.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Написал следующий код:
Код

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




 
PM MAIL ICQ   Вверх
tux
Дата 4.5.2006, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Так ничего не выйдет. Видишь ли, 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;
}
  

Это сообщение отредактировал(а) tux - 4.5.2006, 03:13
PM MAIL Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.