1. 程式人生 > >hibernate4 二級快取demo例項

hibernate4 二級快取demo例項

配置一目瞭然

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

專案結構如下
 

 

hibernate.cfg.xml

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.         <!-- Echo all executed SQL to stdout -->  
  29.         <property name="show_sql">true</property>  
  30.         <!-- Drop and re-create the database schema on startup -->  
  31.         <property name="hbm2ddl.auto">update</property>  
  32.         <mapping class="com.test.pojo.User" />  
  33.     </session-factory>  
  34. </hibernate-configuration>  

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

Xml程式碼  收藏程式碼
  1. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  

而hibernate3的配置是

Xml程式碼  收藏程式碼
  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

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實體類

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. public class User {  
  11.     @Id  
  12.     @GeneratedValue(strategy=GenerationType.IDENTITY)  
  13.     private int id;  
  14.     private String name;  
  15.     private int age;  
  16.     public int getId() {  
  17.         return id;  
  18.     }  
  19.     public void setId(int id) {  
  20.         this.id = id;  
  21.     }  
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.     public int getAge() {  
  29.         return age;  
  30.     }  
  31.     public void 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. public class UserTest {  
  11.     private static SessionFactory sessionFactory = null;  
  12.     @BeforeClass  
  13.     public static void beforeClass() {  
  14.         Configuration configuration = new Configuration();  
  15.         try {  
  16.             configuration.configure();  
  17.         } catch (HibernateException e) {