hibernate4 二级缓存demo实例

hibernate4 二级缓存demo实例

hibernate4 二级缓存demo实例:作者cxl2012

hibernate使用版本是:hibernate-release-4.2.5.Final

需要的jar包:hibernate-release-4.2.5.Final\lib\required下所有jar包

ehcache  jar包:hibernate-release-4.2.5.Final\lib\optional\ehcache下所有包

junit:junit-4.10.jar和mysql-connector-java-5.1.15-bin.jar

注:hibernate 4.2.5版本ehcache缓存不依赖commons-logging-1.1.1.jar,需要的是slf4j-api-1.6.1.jar

项目结构如下

cd53f16b-b654-3ad8-8478-8ee139c4e06d.png

hibernate.cfg.xml

Xml代码   收藏代码
  1. <?xmlversion='1.0'encoding='utf-8'?>

  2. <!DOCTYPE hibernate-configuration PUBLIC  

  3.        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

  4.        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  5. <hibernate-configuration>

  6. <session-factory>

  7. <!-- Database connection settings -->

  8. <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>

  9. <propertyname="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate4</property>

  10. <propertyname="connection.username">root</property>

  11. <propertyname="connection.password">root</property>

  12. <!-- JDBC connection pool (use the built-in) -->

  13. <propertyname="connection.pool_size">1</property>

  14. <!-- SQL dialect -->

  15. <propertyname="dialect">org.hibernate.dialect.MySQL5Dialect</property>

  16. <!-- Enable Hibernate's automatic session context management -->

  17. <propertyname="current_session_context_class">thread</property>

  18. <!-- Disable the second-level cache -->

  19. <!--<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

  20.        -->

  21. <!-- 配置二级缓存 -->

  22. <propertyname="hibernate.cache.use_second_level_cache">true</property>

  23. <propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

  24. <!-- hibernate3的二级缓存配置 -->

  25. <!-- <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> -->

  26. <!-- 开启查询缓存 -->

  27. <propertyname="hibernate.cache.use_query_cache">true</property>

  28. <!-- Echo all executed SQL to stdout -->

  29. <propertyname="show_sql">true</property>

  30. <!-- Drop and re-create the database schema on startup -->

  31. <propertyname="hbm2ddl.auto">update</property>

  32. <mappingclass="com.test.pojo.User"/>

  33. </session-factory>

  34. </hibernate-configuration>


注意:hibernate4和hibernate3配置不一样,hibernate4是

Xml代码   收藏代码
  1. <propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>


而hibernate3的配置是

Xml代码   收藏代码
  1. <propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

此处有一个疑问是:hibernate4的官方文档中,已经把class改了,但是属性名称没有改,还是hibernate.cache.provider_class,不是上面的hibernate.cache.region.factory_class,但是写成hibernate.cache.provider_class会报下面错误


Java代码   收藏代码
  1. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]  

  2.    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186)  

  3.    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)  

  4.    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)  

  5.    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:264)  

  6.    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790)  

  7.    at com.test.pojo.UserTest.beforeClass(UserTest.java:28)  

  8.    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  

  9.    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  

  10.    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  

  11.    at java.lang.reflect.Method.invoke(Method.java:597)  

  12.    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  

  13.    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  

  14.    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  

  15.    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)  

  16.    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  

  17.    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)  

  18.    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  

  19.    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  

  20.    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  

  21.    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  

  22.    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  

  23. Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan, for example, is available in the classpath).  

  24.    at org.hibernate.cache.internal.NoCachingRegionFactory.buildTimestampsRegion(NoCachingRegionFactory.java:87)  

  25.    at org.hibernate.cache.spi.UpdateTimestampsCache.<init>(UpdateTimestampsCache.java:62)  

  26.    at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:72)  

  27.    at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40)  

  28.    at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35)  

  29.    at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:91)  

  30.    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:176)  

  31.    ... 20 more  

说是hibernate.cache.region.factory_class属性没有配置,估计官方文档里没有把属性改过来。。。


ehcache.xml

Xml代码   收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"

  4. updateCheck="false">

  5.    <!--  

  6.        name:cache唯一标识  

  7.        eternal:缓存是否永久有效  

  8.        maxElementsInMemory:内存中最大缓存对象数  

  9.        overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中  

  10.        diskPersistent:硬盘持久化  

  11.        timeToIdleSeconds:缓存清除时间  

  12.        timeToLiveSeconds:缓存存活时间  

  13.        memoryStoreEvictionPolicy:缓存清空策略  

  14.        1.FIFO:first in first out 先讲先出  

  15.        2.LFU: Less Frequently Used 一直以来最少被使用的  

  16.        3.LRU:Least Recently Used  最近最少使用的  

  17.    -->

  18. <defaultCachemaxElementsInMemory="1000"eternal="false"

  19. timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/>

  20. <cachename="userCache"eternal="false"maxElementsInMemory="1000"

  21. overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="3600"

  22. timeToLiveSeconds="3600"memoryStoreEvictionPolicy="LFU"/>

  23. </ehcache>


User实体类

Java代码   收藏代码
  1. package com.test.pojo;  

  2. import javax.persistence.Entity;  

  3. import javax.persistence.GeneratedValue;  

  4. import javax.persistence.GenerationType;  

  5. import javax.persistence.Id;  

  6. import org.hibernate.annotations.Cache;  

  7. import org.hibernate.annotations.CacheConcurrencyStrategy;  

  8. @Entity

  9. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)  

  10. publicclass User {  

  11. @Id

  12. @GeneratedValue(strategy=GenerationType.IDENTITY)  

  13. privateint id;  

  14. private String name;  

  15. privateint age;  

  16. publicint getId() {  

  17. return id;  

  18.    }  

  19. publicvoid setId(int id) {  

  20. this.id = id;  

  21.    }  

  22. public String getName() {  

  23. return name;  

  24.    }  

  25. publicvoid setName(String name) {  

  26. this.name = name;  

  27.    }  

  28. publicint getAge() {  

  29. return age;  

  30.    }  

  31. publicvoid setAge(int age) {  

  32. this.age = age;  

  33.    }  

  34. }  


UserTest测试类:

Java代码   收藏代码
  1. package com.test.pojo;  

  2. import org.hibernate.HibernateException;  

  3. import org.hibernate.Session;  

  4. import org.hibernate.SessionFactory;  

  5. import org.hibernate.cfg.Configuration;  

  6. import org.hibernate.service.ServiceRegistry;  

  7. import org.hibernate.service.ServiceRegistryBuilder;  

  8. import org.junit.BeforeClass;  

  9. import org.junit.Test;  

  10. publicclass UserTest {  

  11. privatestatic SessionFactory sessionFactory = null;  

  12. @BeforeClass

  13. publicstaticvoid beforeClass() {  

  14.        Configuration configuration = new Configuration();  

  15. try {  

  16.            configuration.configure();  

  17.        } catch (HibernateException e) {  

  18. // TODO Auto-generated catch block

  19.            e.printStackTrace();  

  20.        }  

  21.        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  

  22.        sessionFactory = configuration.buildSessionFactory(serviceRegistry);  

  23.    }  

  24. @Test

  25. publicvoid testEhcache() {  

  26.        Session session = sessionFactory.openSession();  

  27.        session.beginTransaction();  

  28.        User u1 = (User) session.load(User.class, 3);  

  29.        System.out.println(u1.getName());  

  30.        session.getTransaction().commit();  

  31.        session.close();  

  32.        Session session2 = sessionFactory.openSession();  

  33.        session2.beginTransaction();  

  34.        User u2 = (User) session2.load(User.class, 3);  

  35.        System.out.println(u2.getName());  

  36.        session2.getTransaction().commit();  

  37.        session2.close();  

  38.    }  

  39. }  

结果:

Java代码   收藏代码
  1. Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from User user0_ where user0_.id=?  

  2. zhangsan  

  3. zhangsan  


list二级缓存测试

Java代码   收藏代码
  1. package com.test.pojo;  

  2. import java.util.List;  

  3. import org.hibernate.HibernateException;  

  4. import org.hibernate.Session;  

  5. import org.hibernate.SessionFactory;  

  6. import org.hibernate.cfg.Configuration;  

  7. import org.hibernate.service.ServiceRegistry;  

  8. import org.hibernate.service.ServiceRegistryBuilder;  

  9. import org.junit.BeforeClass;  

  10. import org.junit.Test;  

  11. publicclass UserTest {  

  12. privatestatic SessionFactory sessionFactory = null;  

  13. @BeforeClass

  14. publicstaticvoid beforeClass() {  

  15.        Configuration configuration = new Configuration();  

  16. try {  

  17.            configuration.configure();  

  18.        } catch (HibernateException e) {  

  19. // TODO Auto-generated catch block

  20.            e.printStackTrace();  

  21.        }  

  22.        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  

  23.        sessionFactory = configuration.buildSessionFactory(serviceRegistry);  

  24.    }  

  25. @SuppressWarnings("unchecked")  

  26. @Test

  27. publicvoid testListEhcache() {  

  28.        Session session = sessionFactory.openSession();  

  29.        session.beginTransaction();  

  30.        List<User> users1 = (List<User>)session.createQuery("from User").setCacheable(true).list();  

  31. for(User user : users1) {  

  32.            System.out.println(user.getName());  

  33.        }  

  34.        session.getTransaction().commit();  

  35.        session.close();  

  36.        Session session2 = sessionFactory.openSession();  

  37.        session2.beginTransaction();  

  38.        List<User> users2 = (List<User>)session2.createQuery("from User").setCacheable(true).list();  

  39. for(User user : users2) {  

  40.            System.out.println(user.getName());  

  41.        }  

  42.        session2.getTransaction().commit();  

  43.        session2.close();  

  44.    }  

  45. }  

输出结果:

Java代码   收藏代码
  1. Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from User user0_  

  2. zhangsan  

  3. zhangsan  

  4. lisi  

  5. wangwu  

  6. zhangsan  

  7. zhangsan  

  8. lisi  

  9. wangwu  



  • a2c47389-366b-3252-80b6-c9d418c8b919-thu

  • 大小: 25.9 KB

  • cd53f16b-b654-3ad8-8478-8ee139c4e06d-thu

  • 大小: 25.4 KB

  • e4985992-f768-3d44-b99b-139b77686c61-thu

  • 大小: 27.6 KB



你可能感兴趣的:(Hibernate4,二级缓存)