Search in sources :

Example 1 with User

use of org.jpwh.model.cache.User in project microservices by pwillhan.

the class SecondLevel method cacheBehavior.

@Test
public void cacheBehavior() throws Exception {
    CacheTestData testData = storeTestData();
    Long USER_ID = testData.users.getFirstId();
    Long ITEM_ID = testData.items.getFirstId();
    UserTransaction tx = TM.getUserTransaction();
    try {
        {
            tx.begin();
            EntityManager em = JPA.createEntityManager();
            // Get the statistics API
            Statistics stats = JPA.getEntityManagerFactory().unwrap(SessionFactory.class).getStatistics();
            SecondLevelCacheStatistics itemCacheStats = stats.getSecondLevelCacheStatistics(Item.class.getName());
            assertEquals(itemCacheStats.getElementCountInMemory(), 3);
            assertEquals(itemCacheStats.getHitCount(), 0);
            // Hit the second-level cache with entity lookup by identifier
            Item item = em.find(Item.class, ITEM_ID);
            assertEquals(itemCacheStats.getHitCount(), 1);
            // Initializing a proxy will also hit the second-level cache
            SecondLevelCacheStatistics userCacheStats = stats.getSecondLevelCacheStatistics(User.class.getName());
            assertEquals(userCacheStats.getElementCountInMemory(), 3);
            assertEquals(userCacheStats.getHitCount(), 0);
            User seller = item.getSeller();
            // Initialize proxy
            assertEquals(seller.getUsername(), "johndoe");
            assertEquals(userCacheStats.getHitCount(), 1);
            // Get the Item#bids collection and its referenced Bid entity instances
            /* 
                   The statistics tell you that there are three <code>Item#bids</code>
                   collections in the cache (one for each <code>Item</code>). No
                   successful cache lookups have occurred so far.
                 */
            SecondLevelCacheStatistics bidsCacheStats = stats.getSecondLevelCacheStatistics(Item.class.getName() + ".bids");
            assertEquals(bidsCacheStats.getElementCountInMemory(), 3);
            assertEquals(bidsCacheStats.getHitCount(), 0);
            /* 
                   The entity cache of <code>Bid</code> has five records, and you
                   haven't accessed it either.
                 */
            SecondLevelCacheStatistics bidCacheStats = stats.getSecondLevelCacheStatistics(Bid.class.getName());
            assertEquals(bidCacheStats.getElementCountInMemory(), 5);
            assertEquals(bidCacheStats.getHitCount(), 0);
            /* 
                   Initializing the collection will read the data from both caches.
                 */
            Set<Bid> bids = item.getBids();
            assertEquals(bids.size(), 3);
            /* 
                   The cache found one collection, as well as the data for
                   its three <code>Bid</code> elements.
                 */
            assertEquals(bidsCacheStats.getHitCount(), 1);
            assertEquals(bidCacheStats.getHitCount(), 3);
            tx.commit();
            em.close();
        }
    } finally {
        TM.rollback();
    }
}
Also used : UserTransaction(javax.transaction.UserTransaction) Item(org.jpwh.model.cache.Item) EntityManager(javax.persistence.EntityManager) User(org.jpwh.model.cache.User) Set(java.util.Set) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) Statistics(org.hibernate.stat.Statistics) QueryStatistics(org.hibernate.stat.QueryStatistics) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) NaturalIdCacheStatistics(org.hibernate.stat.NaturalIdCacheStatistics) Test(org.testng.annotations.Test) JPATest(org.jpwh.env.JPATest)

Example 2 with User

use of org.jpwh.model.cache.User in project microservices by pwillhan.

the class SecondLevel method cacheNaturalId.

@Test
public void cacheNaturalId() throws Exception {
    CacheTestData testData = storeTestData();
    Long USER_ID = testData.users.getFirstId();
    Long ITEM_ID = testData.items.getFirstId();
    UserTransaction tx = TM.getUserTransaction();
    try {
        Statistics stats = JPA.getEntityManagerFactory().unwrap(SessionFactory.class).getStatistics();
        // Clear all natural ID cache regions
        JPA.getEntityManagerFactory().getCache().unwrap(org.hibernate.Cache.class).evictNaturalIdRegions();
        // Clear the User entity cache region
        JPA.getEntityManagerFactory().getCache().evict(User.class);
        {
            tx.begin();
            EntityManager em = JPA.createEntityManager();
            Session session = em.unwrap(Session.class);
            NaturalIdCacheStatistics userIdStats = stats.getNaturalIdCacheStatistics(User.class.getName() + "##NaturalId");
            assertEquals(userIdStats.getElementCountInMemory(), 0);
            User user = (User) session.byNaturalId(User.class).using("username", "johndoe").load();
            // select ID from USERS where USERNAME = ?
            // select * from USERS where ID = ?
            assertNotNull(user);
            assertEquals(userIdStats.getHitCount(), 0);
            assertEquals(userIdStats.getMissCount(), 1);
            assertEquals(userIdStats.getElementCountInMemory(), 1);
            SecondLevelCacheStatistics userStats = stats.getSecondLevelCacheStatistics(User.class.getName());
            assertEquals(userStats.getHitCount(), 0);
            assertEquals(userStats.getMissCount(), 1);
            assertEquals(userStats.getElementCountInMemory(), 1);
            tx.commit();
            em.close();
        }
        {
            // Execute the lookup again, hit the cache
            tx.begin();
            EntityManager em = JPA.createEntityManager();
            Session session = em.unwrap(Session.class);
            /* 
                   The natural identifier cache region for <code>User</code>s
                   has one element.
                 */
            NaturalIdCacheStatistics userIdStats = stats.getNaturalIdCacheStatistics(User.class.getName() + "##NaturalId");
            assertEquals(userIdStats.getElementCountInMemory(), 1);
            /* 
                   The <code>org.hibernate.Session</code> API performs natural
                   identifier lookup; this is the only API for accessing the
                   natural identifier cache.
                 */
            User user = (User) session.byNaturalId(User.class).using("username", "johndoe").load();
            assertNotNull(user);
            /* 
                   You had a cache hit for the natural identifier lookup; the
                   cache returned the identifier value of "johndoe".
                 */
            assertEquals(userIdStats.getHitCount(), 1);
            /* 
                   You also had a cache hit for the actual entity data of
                   that <code>User</code>.
                 */
            SecondLevelCacheStatistics userStats = stats.getSecondLevelCacheStatistics(User.class.getName());
            assertEquals(userStats.getHitCount(), 1);
            tx.commit();
            em.close();
        }
    } finally {
        TM.rollback();
    }
}
Also used : UserTransaction(javax.transaction.UserTransaction) SessionFactory(org.hibernate.SessionFactory) EntityManager(javax.persistence.EntityManager) NaturalIdCacheStatistics(org.hibernate.stat.NaturalIdCacheStatistics) User(org.jpwh.model.cache.User) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) Statistics(org.hibernate.stat.Statistics) QueryStatistics(org.hibernate.stat.QueryStatistics) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) NaturalIdCacheStatistics(org.hibernate.stat.NaturalIdCacheStatistics) Cache(javax.persistence.Cache) Session(org.hibernate.Session) Test(org.testng.annotations.Test) JPATest(org.jpwh.env.JPATest)

Example 3 with User

use of org.jpwh.model.cache.User in project microservices by pwillhan.

the class SecondLevel method storeTestData.

public CacheTestData storeTestData() throws Exception {
    UserTransaction tx = TM.getUserTransaction();
    tx.begin();
    EntityManager em = JPA.createEntityManager();
    Long[] itemIds = new Long[3];
    Long[] userIds = new Long[3];
    User johndoe = new User("johndoe");
    em.persist(johndoe);
    userIds[0] = johndoe.getId();
    User janeroe = new User("janeroe");
    em.persist(janeroe);
    userIds[1] = janeroe.getId();
    User robertdoe = new User("robertdoe");
    em.persist(robertdoe);
    userIds[2] = robertdoe.getId();
    Item item = new Item("Item One", CalendarUtil.TOMORROW.getTime(), johndoe);
    em.persist(item);
    itemIds[0] = item.getId();
    for (int i = 1; i <= 3; i++) {
        Bid bid = new Bid(item, robertdoe, new BigDecimal(9 + i));
        item.getBids().add(bid);
        em.persist(bid);
    }
    item = new Item("Item Two", CalendarUtil.TOMORROW.getTime(), johndoe);
    em.persist(item);
    itemIds[1] = item.getId();
    for (int i = 1; i <= 1; i++) {
        Bid bid = new Bid(item, janeroe, new BigDecimal(2 + i));
        item.getBids().add(bid);
        em.persist(bid);
    }
    item = new Item("Item_Three", CalendarUtil.AFTER_TOMORROW.getTime(), janeroe);
    em.persist(item);
    itemIds[2] = item.getId();
    for (int i = 1; i <= 1; i++) {
        Bid bid = new Bid(item, johndoe, new BigDecimal(3 + i));
        item.getBids().add(bid);
        em.persist(bid);
    }
    tx.commit();
    em.close();
    // Warm up the cache properly
    tx.begin();
    em = JPA.createEntityManager();
    // We load all the User instances into the second-level cache
    // here because NONSTRICT_READ_WRITE strategy doesn't insert
    // them into the second-level cache when persist() is called,
    // only when they are loaded from the database. And we need
    // to do this in a new transaction, or TwoPhaseLoad doesn't
    // put it in the cache.
    em.createQuery("select u from User u").getResultList();
    // collection is loaded.
    for (Long itemId : itemIds) {
        em.find(Item.class, itemId).getBids().size();
    }
    tx.commit();
    em.close();
    JPA.getEntityManagerFactory().unwrap(SessionFactory.class).getStatistics().clear();
    CacheTestData testData = new CacheTestData();
    testData.items = new TestData(itemIds);
    testData.users = new TestData(userIds);
    return testData;
}
Also used : UserTransaction(javax.transaction.UserTransaction) Item(org.jpwh.model.cache.Item) EntityManager(javax.persistence.EntityManager) User(org.jpwh.model.cache.User) TestData(org.jpwh.shared.util.TestData) Bid(org.jpwh.model.cache.Bid) BigDecimal(java.math.BigDecimal)

Aggregations

EntityManager (javax.persistence.EntityManager)3 UserTransaction (javax.transaction.UserTransaction)3 User (org.jpwh.model.cache.User)3 NaturalIdCacheStatistics (org.hibernate.stat.NaturalIdCacheStatistics)2 QueryStatistics (org.hibernate.stat.QueryStatistics)2 SecondLevelCacheStatistics (org.hibernate.stat.SecondLevelCacheStatistics)2 Statistics (org.hibernate.stat.Statistics)2 JPATest (org.jpwh.env.JPATest)2 Item (org.jpwh.model.cache.Item)2 Test (org.testng.annotations.Test)2 BigDecimal (java.math.BigDecimal)1 Set (java.util.Set)1 Cache (javax.persistence.Cache)1 Session (org.hibernate.Session)1 SessionFactory (org.hibernate.SessionFactory)1 Bid (org.jpwh.model.cache.Bid)1 TestData (org.jpwh.shared.util.TestData)1