Quick Contact

    Hibernate

    Hibernate First Level Cache with Example

    Understanding Hibernate First Level Cache With Example.

    • Caching is facility provided by ORM framework which help users to get fast running web application, while help framework itself to reduce number of quaries made to database in a single transaction. Hibernate achives the second goal by implementing first level cache.
    • First level cache is enabled by default and you can notdiasable it.
    • First level cache is associated with session object and other session objects in application can not see it.
    • The scope of session cache objects is of session. Once session is closed, cached object is gone forever.

    First level cache retrieval example

    In this example, we are fetching student object from the database using a hibernate session. we will retrieve it multiple times and will observe the SQL logs to see the differences.

    packagenet.ducatindia.hibernate.tutorial;
    
    importorg.hibernate.Session;
    importorg.hibernate.Transaction;
    
    importnet.ducatindia.hibernate.tutorial.config.HibernateJavaConfig;
    importnet.ducatindia.hibernate.tutorial.entity.Student;
    
    publicclassFirstLevelCacheDemo {
    
    publicstaticvoidmain(String[] args) {
    
    Transactiontransaction=null;
    try (Sessionsession=HibernateJavaConfig.getSessionfactory().openSession()) {
    
    // start the transaction
    transaction=session.beginTransaction();
    
    // get the student entity using id
    Student student1 =session.load(Student.class, newLong(1));
    
    System.out.println(student1.getFirstName());
    System.out.println(student1.getLastName());
    System.out.println(student1.getEmail());
    
    // load student entity by id
    Student student2 =session.load(Student.class, newLong(1));
    System.out.println(student2.getFirstName());
    System.out.println(student2.getLastName());
    System.out.println(student2.getEmail());
    
    // commit transaction
    transaction.commit();
    
            } catch (Exception e) {
    if (transaction !=null) {
    transaction.rollback();
                }
            }
        }
    }
    

    Output:

    Hibernate: select student0_.id as id1_0_0_, student0_.email as email2_0_0_, student0_.first_name as first_na3_0_0_, 
    student0_.last_name as last_nam4_0_0_ from student student0_ where student0_.id=?
    sachin
    patwa
    sachin@gmail.com
    sachin
    patwa
    sachin@gmail.com
    

    As you can see that second “session.load()” statement does not execute the select query again and loads the student entity directly.

    First level cache retrieval example with a new session

    With the new session, an entity is fetched from the database again irrespective of it is already present in any other session in application.

    packagenet.ducatindia.hibernate.tutorial;
    
    importjava.io.Serializable;
    
    importorg.hibernate.Session;
    importorg.hibernate.Transaction;
    
    importnet.ducatindia.hibernate.tutorial.config.HibernateJavaConfig;
    importnet.ducatindia.hibernate.tutorial.entity.Student;
    
    publicclassFirstLevelCacheDemo1 {
    
    publicstaticvoidmain(String[] args) {
    
    Transactiontransaction=null;
    try (Sessionsession=HibernateJavaConfig.getSessionfactory().openSession(); Session session1 =HibernateJavaConfig.getSessionfactory().openSession()) {
    
    // start the transaction
    transaction=session.beginTransaction();
    
    // get the student entity using id
    Student student1 =session.load(Student.class, newLong(1));
    
    System.out.println(student1.getFirstName());
    System.out.println(student1.getLastName());
    System.out.println(student1.getEmail());
    
    // load student entity by id
    Student student2 =session.load(Student.class, newLong(1));
    System.out.println(student2.getFirstName());
    System.out.println(student2.getLastName());
    System.out.println(student2.getEmail());
    
    // load student entity by id
    Student student3 =session1.load(Student.class, newLong(1));
    System.out.println(student3.getFirstName());
    System.out.println(student3.getLastName());
    System.out.println(student3.getEmail());
    
    // commit transaction
    transaction.commit();
    
            } catch (Exception e) {
    if (transaction !=null) {
    transaction.rollback();
                }
            }
        }
    }
    

    You can see that even if the student entity was stored in the “session” object, still another database query was executed when we use another session object “session1”.

    Removing cache objects from first level cache example

    Though we can not disable the first level cache in hibernate, we can certainly remove some of the objects from it when needed. This is done using two methods:

    • Session.evict()
    • Session.clear()

    Here Session.evict() is used to remove a particular object from the cache associated with a session, and a clear() method is used to remove all cached objects associated with a session. So they are essentially like remove one and remove all.

    packagenet.ducatindia.hibernate.tutorial;
    
    importorg.hibernate.Session;
    importorg.hibernate.Transaction;
    
    importnet.ducatindia.hibernate.tutorial.config.HibernateJavaConfig;
    importnet.ducatindia.hibernate.tutorial.entity.Student;
    
    publicclassRemoveFirstCacheDemo {
    
    publicstaticvoidmain(String[] args) {
    
    Transactiontransaction=null;
    try (Sessionsession=HibernateJavaConfig.getSessionfactory().openSession()) {
    
    // start the transaction
    transaction=session.beginTransaction();
    
    // get the student entity using id
    Student student1 =session.load(Student.class, newLong(1));
    
    System.out.println(student1.getFirstName());
    System.out.println(student1.getLastName());
    System.out.println(student1.getEmail());
    
    // load student entity by id
    Student student2 =session.load(Student.class, newLong(1));
    System.out.println(student2.getFirstName());
    System.out.println(student2.getLastName());
    System.out.println(student2.getEmail());
    
    //session.evict(student2);
    session.clear();
    // load student entity by id
    Student student3 =session.load(Student.class, newLong(1));
    System.out.println(student3.getFirstName());
    System.out.println(student3.getLastName());
    System.out.println(student3.getEmail());
    
    // commit transaction
    transaction.commit();
    
            } catch (Exception e) {
    if (transaction !=null) {
    transaction.rollback();
                }
            }
        }
    }
    

    Clearly, Session.evict() method removed the student object from the cache so that it was fetched again from the database.

    Apply now for Advanced Java Training Course

    Copyright 1999- Ducat Creative, All rights reserved.

    Anda bisa mendapatkan server slot online resmi dan terpercaya tentu saja di sini. Sebagai salah satu provider yang menyediakan banyak pilihan permainan.