Hibernate Second Level Cache Example

Let us see the example on this hibernate second level cache.  please go through the concept on this second level cache, still if you have any doubt [ Click here ]

Files required….

  • Product.java  [ Pojo class]
  • ForOurLogic.java
  • Product.hbm.xml
  • ehcache.xml
  • hibernate.cfg.xml

Product.java

1234567891011121314151617181920212223242526272829303132333435package str;

public class Product{

	private int productId;
	private String proName;
	private double price;

	public void setProductId(int productId)
	{
	    this.productId = productId;
	}
	public int getProductId()
	{
	    return productId;
	}

	public void setProName(String proName)
	{
	    this.proName = proName;
	}
	public String getProName()
	{
	    return proName;
	}

	public void setPrice(double price)
	{
	    this.price = price;
	}
	public double getPrice()
	{
	    return price;
	}
}

ForOurLogic.java

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package str;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class ForOurLogic { 

	public static void main(String[] args)
	{

		Configuration cfg = new Configuration();
		cfg.configure("hibernate.cfg.xml"); 

		SessionFactory factory = cfg.buildSessionFactory();

Session session1 = factory.openSession();

Object o=session1.load(Product.class,new Integer(105)); Product s=(Product)o; System.out.println("Loaded object product name is___"+s.getProName()); System.out.println("Object Loaded successfully.....!!");

session1.close();

System.out.println("------------------------------"); System.out.println("Waiting......");

try{

Thread.sleep(6000);

}

catch (Exception e) {

}

System.out.println("6 seconds compelted......!!!!!!!!");

Session session2 = factory.openSession();

Object o2=session2.load(Product.class,new Integer(105)); Product s2=(Product)o2; System.out.println("Loaded object product name is___"+s2.getProName()); System.out.println("Object loaded from the database...!!");

session2.close();

Session session3 = factory.openSession();

Object o3=session3.load(Product.class,new Integer(105)); Product s3=(Product)o3; System.out.println("Loaded object product name is___"+s3.getProName()); System.out.println("Object loaded from global cache successfully.....!!");

session3.close();

factory.close(); } }

 

Product.hbm.xml

123456789101112131415<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="str.Product" table="products">

<cache usage="read-only" />

<id name="productId" column="pid"  /> <property name="proName" column="pname" length="10"/> <property name="price"/> </class> </hibernate-mapping>

 

hibernate.cfg.xml

123456789101112131415161718192021222324<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver
</property>
<property name="connection.url">jdbc:oracle:thin:@www.java4s.com:1521:XE</property>
<property name="connection.username">system</property>
<property name="connection.password">admin</property>

<property name="cache.provider_class">

org.hibernate.cache.EhCacheProvider

</property>

<property name="dialect">org.hibernate.dialect.OracleDialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="Product.hbm.xml"></mapping> </session-factory> </hibernate-configuration>

 

ehcache.xml

12345678<?xml version="1.0"?>

<ehcache>

<defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="200" />

<cache name="str.Product" maxElementsInMemory="100" eternal="false" timeToIdleSeconds="5" timeToLiveSeconds="200" />

</ehcache>

Regarding ehcache.xml

  • In ehcache.xml, if eternal=”true” then we should not write timeToIdealSeconds, timeToLiveSeconds,  hibernate will take care about those values
  • So if you want to give values manually better eternal=”false” always,  so that we can assign values into timeToIdealSeconds, timeToLiveSeconds manually, and play ?
  • timeToIdealSeconds=”seconds” means, if the object in the global chche is ideal, means not using by any other class or object then it will be waited for some time we specified and deleted from the global cache if time is exceeds more than timeToIdealSeconds value
  • timeToLiveSeconds=”seconds” means, the other Session or class using this object or not, i mean may be it is using by other sessions or may not, what ever the situation might be, once it competed the time specified timeToLiveSeconds, then it will be removed from the global cache by hibernate
  • Actually <defaultCache … /> will reflects to all the pojo classes in our application,  and we can also assign the ehcache values to specified pojo class by <cache name=”– your pojo class name —” …….. />
  •  

     Regarding ForOurLogic.java

  • From line numbers 16 – 22 we opened session1 and loaded object and closed session1, this time object will be loaded from the database as its the first time
  • Then from 27 – 31 we have been waited for 6 seconds,  but in our ehcache.xml we have given timeToIdleSeconds=”5″ , i mean after 5 seconds object will be removed from the global cache
  • And again in ForOurLogic.java line numbers 35 – 41 we opened second session and loaded the object, this time hibernate will loads the object from the database, and closed the session
  • Immediately from 43 – 49 we opened session3 and loaded the object, this time hibernate will loads the object form the global session not from the database
  • And that’s it mates….!!!!!!!

Related Articles

post a comment