Package org.hibernate.test.cache

Source Code of org.hibernate.test.cache.HibernateCacheTest

package org.hibernate.test.cache;

import lombok.extern.slf4j.Slf4j;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cache.redis.util.HibernateCacheUtil;
import org.hibernate.stat.SecondLevelCacheStatistics;
import org.hibernate.stat.Statistics;
import org.hibernate.test.AbstractHibernateTest;
import org.hibernate.test.domain.Account;
import org.hibernate.test.domain.Item;
import org.hibernate.test.domain.Person;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

import static org.fest.assertions.Assertions.assertThat;

/**
* Hibernate 실전 테스트 입니다.
* <p/>
*
* @author sunghyouk.bae@gmail.com
* @since 13. 4. 6. 오전 12:51
*/
@Slf4j
public class HibernateCacheTest extends AbstractHibernateTest {

//    @Rule
//    public TestRule benchmarkRun = new BenchmarkRule();


    @Before
    public void before() {
        sessionFactory.getStatistics().setStatisticsEnabled(true);
        sessionFactory.getStatistics().clear();
    }

    public SecondLevelCacheStatistics getSecondLevelCacheStatistics(Class clazz) {
        final String regionName = HibernateCacheUtil.getRegionName(sessionFactory, clazz);
        return sessionFactory.getStatistics().getSecondLevelCacheStatistics(regionName);
    }

    @Test
    public void emptySecondLevelCacheEntry() throws Exception {
        sessionFactory.getCache().evictEntityRegion(Item.class);
        Statistics stats = sessionFactory.getStatistics();
        stats.clear();

        final String regionName = HibernateCacheUtil.getRegionName(sessionFactory, Item.class);
        SecondLevelCacheStatistics statistics = getSecondLevelCacheStatistics(Item.class);

        log.info("SecondLevel Cache Region=[{}], ElementInMemory=[{}], HitCount=[{}]",
                 regionName, statistics.getElementCountInMemory(), statistics.getHitCount());
    }

    @Test
    public void queryCacheInvalidation() throws Exception {

        sessionFactory.getCache().evictEntityRegion(Item.class);

        Session s = sessionFactory.openSession();
        Transaction t = s.beginTransaction();
        Item i = new Item();
        i.setName("Widget");
        i.setDescription("A realy top-quality, full-featured widget.");
        s.persist(i);
        t.commit();
        s.close();


        SecondLevelCacheStatistics slcs = getSecondLevelCacheStatistics(Item.class);
        log.info(slcs.toString());

        Session session = sessionFactory.openSession();
        Item loaded = (Item) session.get(Item.class, i.getId());
        assertThat(loaded).isNotNull();
        session.close();

        log.info(slcs.toString());
        assertThat(slcs.getPutCount()).isEqualTo(1);
        assertThat(slcs.getElementCountInMemory()).isEqualTo(1);
    }

    @Test
    public void simpleEntityCaching() {

        sessionFactory.getCache().evictEntityRegion(Item.class);
        SecondLevelCacheStatistics slcs = getSecondLevelCacheStatistics(Item.class);
        Session session;

        log.debug("Item 저장 - #1");
        Item item = new Item();
        item.setName("redis");
        item.setDescription("redis cache item");

        session = sessionFactory.openSession();
        session.save(item);
        session.flush();
        session.close();

        log.debug("Item 조회 - #1");
        session = sessionFactory.openSession();
        Item loaded = (Item) session.get(Item.class, item.getId());
        assertThat(loaded).isNotNull();
        session.close();

        log.info(slcs.toString());
        // assertThat(slcs.getPutCount()).isEqualTo(1);
        // assertThat(slcs.getElementCountInMemory()).isEqualTo(1);


        log.debug("Item Update - #1");
        session = sessionFactory.openSession();
        // session.merge(loaded);
        loaded.setDescription("Update description...");
        session.saveOrUpdate(loaded);
        session.flush();
        session.close();

        log.debug("Item 조회 - #2");
        session = sessionFactory.openSession();
        loaded = (Item) session.get(Item.class, loaded.getId());
        assertThat(loaded).isNotNull();
        assertThat(loaded.getId()).isEqualTo(item.getId());
        assertThat(loaded.getDescription()).isNotEqualTo(item.getDescription());
        session.close();

        log.debug("Item 조회 - #3");
        session = sessionFactory.openSession();
        loaded = (Item) session.get(Item.class, loaded.getId());
        assertThat(loaded).isNotNull();
        assertThat(loaded.getId()).isEqualTo(item.getId());
        assertThat(loaded.getDescription()).isNotEqualTo(item.getDescription());
        session.close();

        log.debug("Item 조회 - #4");
        session = sessionFactory.openSession();
        loaded = (Item) session.get(Item.class, loaded.getId());
        assertThat(loaded).isNotNull();
        assertThat(loaded.getId()).isEqualTo(item.getId());
        assertThat(loaded.getDescription()).isNotEqualTo(item.getDescription());
        session.close();

        log.info(slcs.toString());
        // assertThat(slcs.getPutCount()).isEqualTo(1);
        // assertThat(slcs.getElementCountInMemory()).isEqualTo(1);
    }

    @Test
    public void hqlLoad() throws Exception {
        sessionFactory.getCache().evictEntityRegion(Item.class);
        SecondLevelCacheStatistics slcs = getSecondLevelCacheStatistics(Item.class);
        Session session;

        log.debug("Item 저장 - #1");
        Item item = new Item();
        item.setName("redis");
        item.setDescription("redis cache item");

        session = sessionFactory.openSession();
        session.save(item);
        session.flush();
        session.close();

        log.debug("Item 조회 - #1");
        session = sessionFactory.openSession();
        Query query = session.createQuery("select e from Item e where e.id=:id").setParameter("id", item.getId()).setCacheable(true);
        Item loaded = (Item) query.uniqueResult();
        assertThat(loaded).isNotNull();
        session.close();

        log.debug("Item 조회 - #2");
        session = sessionFactory.openSession();
        query = session.createQuery("select e from Item e where e.id=:id").setParameter("id", item.getId()).setCacheable(true);
        loaded = (Item) query.uniqueResult();
        assertThat(loaded).isNotNull();
        session.close();

        log.debug("Item 조회 - #3");
        session = sessionFactory.openSession();
        loaded = (Item) session.get(Item.class, item.getId());
        assertThat(loaded).isNotNull();
        session.close();

        log.debug("Item 조회 - #4");
        session = sessionFactory.openSession();
        query = session.createQuery("select e from Item e where e.id=:id").setParameter("id", item.getId()).setCacheable(true);
        loaded = (Item) query.uniqueResult();
        assertThat(loaded).isNotNull();
        session.close();
    }

    @Test
    public void nonrestrictCaching() {
        sessionFactory.getCache().evictEntityRegion(Account.class);
        sessionFactory.getCache().evictEntityRegion(Person.class);

        SecondLevelCacheStatistics slcs = getSecondLevelCacheStatistics(Account.class);
        SecondLevelCacheStatistics slcs2 = getSecondLevelCacheStatistics(Person.class);

        Session session = sessionFactory.openSession();

        Person person = new Person();
        person.setAge(40);
        person.setFirstname("Bae");
        person.setLastname("Sunghyouk");
        session.save(person);

        Account account = new Account();
        account.setPerson(person);
        session.save(account);

        session.flush();
        session.close();

        session = sessionFactory.openSession();
        Account acc = (Account) session.get(Account.class, account.getId());
        assertThat(acc).isNotNull();
        assertThat(acc.getPerson()).isNotNull();
        session.close();

        log.info("Account:[{}]", slcs.toString());
        assertThat(slcs.getPutCount()).isEqualTo(1);
        assertThat(slcs.getElementCountInMemory()).isEqualTo(1);

        log.info("Person:[{}]", slcs2.toString());
        assertThat(slcs2.getPutCount()).isEqualTo(1);
        assertThat(slcs2.getElementCountInMemory()).isEqualTo(1);

        session = sessionFactory.openSession();
        acc = (Account) session.get(Account.class, account.getId());
        assertThat(acc).isNotNull();
        assertThat(acc.getPerson()).isNotNull();
        session.close();

        log.info("Account:[{}]", slcs.toString());
        assertThat(slcs.getPutCount()).isEqualTo(1);
        assertThat(slcs.getElementCountInMemory()).isEqualTo(1);

        log.info("Person:[{}]", slcs2.toString());
        assertThat(slcs2.getPutCount()).isEqualTo(1);
        assertThat(slcs2.getElementCountInMemory()).isEqualTo(1);
    }

    @Test
    @SuppressWarnings("unchecked")
    public void massiveCaching() {
        sessionFactory.getCache().evictEntityRegion(Item.class);

        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();

        int count = 100;

        for (int i = 0; i < count; i++) {
            Item item = new Item();
            item.setName("redis - " + i);
            item.setDescription("redis cache item - " + i);
            session.save(item);
        }
        tx.commit();
        session.close();

        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        List<Item> items = (List<Item>) session.createCriteria(Item.class).list();

        assertThat(items.size()).isEqualTo(count);

        items = (List<Item>) session.createCriteria(Item.class).list();

        for (Item item : items) {
            session.update(item);
        }
        tx.commit();
        session.close();

        SecondLevelCacheStatistics slcs = getSecondLevelCacheStatistics(Item.class);
        log.info(slcs.toString());
        assertThat(slcs.getPutCount()).isEqualTo(count);
        assertThat(slcs.getElementCountInMemory()).isEqualTo(count);

        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        items = (List<Item>) session.createCriteria(Item.class).list();
        for (Item item : items) {
            item.getName();
        }
        tx.commit();
        session.close();

        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        items = (List<Item>) session.createCriteria(Item.class).list();
        for (Item item : items) {
            session.delete(item);
        }
        tx.commit();
        session.flush();
        session.close();
    }
}
TOP

Related Classes of org.hibernate.test.cache.HibernateCacheTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.