• hibernate4 二级缓存demo实例


    转载:http://blog.csdn.net/chaoowang/article/details/21236501

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

    需要的jar包:hibernate-release-4.3.4Finallib equired下所有jar包

    ehcache  jar包:hibernate-release-4.3.4.Finalliboptionalehcache下所有包

    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

    项目结构如下
     

     

    hibernate.cfg.xml

    1. <?xml version='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.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    9.         <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate4</property>  
    10.         <property name="connection.username">root</property>  
    11.         <property name="connection.password">root</property>  
    12.         <!-- JDBC connection pool (use the built-in) -->  
    13.         <property name="connection.pool_size">1</property>  
    14.         <!-- SQL dialect -->  
    15.         <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>  
    16.         <!-- Enable Hibernate's automatic session context management -->  
    17.         <property name="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.         <property name="hibernate.cache.use_second_level_cache">true</property>  
    23.         <property name="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.         <property name="hibernate.cache.use_query_cache">true</property>  
    28.           
    29.         <!-- Echo all executed SQL to stdout -->  
    30.         <property name="show_sql">true</property>  
    31.         <!-- Drop and re-create the database schema on startup -->  
    32.         <property name="hbm2ddl.auto">update</property>  
    33.         <mapping class="com.test.pojo.User" />  
    34.     </session-factory>  
    35. </hibernate-configuration>  

     

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

    1. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  

     

    而hibernate3的配置是

    1. <property name="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

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <ehcache xmlns: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.     <defaultCache maxElementsInMemory="1000" eternal="false"  
    19.         timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />  
    20.     <cache name="userCache" eternal="false" maxElementsInMemory="1000"  
    21.         overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="3600"  
    22.         timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LFU" />  
    23. </ehcache>  

     

    User实体类

    1. package com.test.pojo;  
    2.   
    3. import javax.persistence.Entity;  
    4. import javax.persistence.GeneratedValue;  
    5. import javax.persistence.GenerationType;  
    6. import javax.persistence.Id;  
    7.   
    8. import org.hibernate.annotations.Cache;  
    9. import org.hibernate.annotations.CacheConcurrencyStrategy;  
    10.   
    11. @Entity  
    12. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)  
    13. public class User {  
    14.     @Id  
    15.     @GeneratedValue(strategy=GenerationType.IDENTITY)  
    16.     private int id;  
    17.     private String name;  
    18.     private int age;  
    19.     public int getId() {  
    20.         return id;  
    21.     }  
    22.     public void setId(int id) {  
    23.         this.id = id;  
    24.     }  
    25.     public String getName() {  
    26.         return name;  
    27.     }  
    28.     public void setName(String name) {  
    29.         this.name = name;  
    30.     }  
    31.     public int getAge() {  
    32.         return age;  
    33.     }  
    34.     public void setAge(int age) {  
    35.         this.age = age;  
    36.     }  
    37.       
    38. }  

     

    UserTest测试类:

    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.   
    11. public class UserTest {  
    12.       
    13.     private static SessionFactory sessionFactory = null;  
    14.     @BeforeClass  
    15.     public static void beforeClass() {  
    16.         Configuration configuration = new Configuration();  
    17.           
    18.   
    19.         try {  
    20.             configuration.configure();  
    21.         } catch (HibernateException e) {  
    22.             // TODO Auto-generated catch block  
    23.             e.printStackTrace();  
    24.         }  
    25.               
    26.           
    27.         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
    28.         sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
    29.     }   
    30.     @Test  
    31.     public void testEhcache() {  
    32.         Session session = sessionFactory.openSession();  
    33.         session.beginTransaction();  
    34.         User u1 = (User) session.load(User.class, 3);  
    35.         System.out.println(u1.getName());  
    36.         session.getTransaction().commit();  
    37.         session.close();  
    38.         Session session2 = sessionFactory.openSession();  
    39.           
    40.         session2.beginTransaction();  
    41.         User u2 = (User) session2.load(User.class, 3);  
    42.         System.out.println(u2.getName());  
    43.         session2.getTransaction().commit();  
    44.         session2.close();  
    45.     }  
    46. }  

     结果:

     
    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二级缓存测试

    1. package com.test.pojo;  
    2. import java.util.List;  
    3.   
    4. import org.hibernate.HibernateException;  
    5. import org.hibernate.Session;  
    6. import org.hibernate.SessionFactory;  
    7. import org.hibernate.cfg.Configuration;  
    8. import org.hibernate.service.ServiceRegistry;  
    9. import org.hibernate.service.ServiceRegistryBuilder;  
    10. import org.junit.BeforeClass;  
    11. import org.junit.Test;  
    12.   
    13. public class UserTest {  
    14.       
    15.     private static SessionFactory sessionFactory = null;  
    16.     @BeforeClass  
    17.     public static void beforeClass() {  
    18.         Configuration configuration = new Configuration();  
    19.           
    20.   
    21.         try {  
    22.             configuration.configure();  
    23.         } catch (HibernateException e) {  
    24.             // TODO Auto-generated catch block  
    25.             e.printStackTrace();  
    26.         }  
    27.               
    28.           
    29.         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
    30.         sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
    31.     }   
    32.     @SuppressWarnings("unchecked")  
    33.     @Test  
    34.     public void testListEhcache() {  
    35.         Session session = sessionFactory.openSession();  
    36.         session.beginTransaction();  
    37.         List<User> users1 = (List<User>)session.createQuery("from User").setCacheable(true).list();  
    38.         for(User user : users1) {  
    39.             System.out.println(user.getName());  
    40.         }  
    41.         session.getTransaction().commit();  
    42.         session.close();  
    43.           
    44.         Session session2 = sessionFactory.openSession();  
    45.         session2.beginTransaction();  
    46.         List<User> users2 = (List<User>)session2.createQuery("from User").setCacheable(true).list();  
    47.         for(User user : users2) {  
    48.             System.out.println(user.getName());  
    49.         }  
    50.         session2.getTransaction().commit();  
    51.         session2.close();  
    52.     }  
    53. }  

     输出结果:

    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  
  • 相关阅读:
    又来项目了,星座运势widget
    ubuntu下编译android源代码
    Android UI,界面辅助设置工具,可随意拖动控件,比google官方提供的方便
    Android 1.5原生软件开发SDK公布
    REST转自WIKI
    Android SDK 1.5 包装索引
    android google market FreshFace上线了,大家都试用试用,反正免费的
    JSON
    ubuntu命令
    网站支付宝接口错误代码:TRADE_DATA_MATCH_ERROR怎么处理? uz
  • 原文地址:https://www.cnblogs.com/liaojie970/p/5160166.html
Copyright © 2020-2023  润新知