Spring 3.2.1.RELEASE MVC 基于注解ehcache.xml 配置方式

载的关联包里的ehcache-spring-annotations.jar之外,还需要spring-context-support.jar,cblib-2.2.jar.

<dependency>
			<groupId>com.googlecode.ehcache-spring-annotations</groupId>
			<artifactId>ehcache-spring-annotations</artifactId>
			<version>1.2.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>3.2.1.RELEASE</version>
		</dependency>

Spring3.0.5MVC基于注解ehcache.xml配置方式http://www.blogjava.net/zzzlyr/articles/343234.html

spring3.0.5发布后,公司使用SpringMVC+Hibernate3.5做项目,其中用到了缓存机制,spring3.0.5中ehcache配置方法很简单,其中缓存机制很细颗粒化,可以具体到把每个方式的返回值做缓存,好了不说废话下面开始:

需要JAR包:

第一:spring3.0.5其中JAR;

第二:另外需要增量JAR包(cglib-2.2.jar,ehcache-spring-annotations-1.1.2.jar)注意版本;

其中applicationContext.xml其中配置:

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/aop 
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-3.0.xsd
  http://www.springframework.org/schema/tx 
  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring   
  http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

<ehcache:annotation-driven cache-manager="ehCacheManager" /> 
 
 <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  
       <property name="configLocation" value="classpath:ehcache.xml" />  
   </bean>

加到你的文件中去,上边是头信息自己可以比照下,没有的加进去;

在你的src目录下新建ehcache.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
 updateCheck="false">
 <diskStore path="java.io.tmpdir" />
 <defaultCache eternal="false" 
   maxElementsInMemory="1000"
   overflowToDisk="false" 
   diskPersistent="false" 
   timeToIdleSeconds="0"
   timeToLiveSeconds="600" 
   memoryStoreEvictionPolicy="LRU" />

 <cache name="departCache" 
   eternal="false"
   maxElementsInMemory="100"
   overflowToDisk="false"
   diskPersistent="false" 
   timeToIdleSeconds="0"
   timeToLiveSeconds="300"
   memoryStoreEvictionPolicy="LRU" />

</ehcache>

其中里边详细配置自己可以去上网搜下;

这样基本上配置完成了:

DAO层缓存:例如下边这个方法的返回值需要缓存:

@SuppressWarnings("unchecked")
 //spring 3 基于注解ehcache缓存配置;
 @Cacheable(cacheName="departCache") 
 public List<AppDepart> getChildDepart(Integer id) throws Exception {
  return  this.getHibernateTemplate().find("from AppDepart  where state=1 and idParent="+id);
 }

@Cacheable(cachename="departCache")加上这句话,其中cacheName对应ehcache.xml中的<cachename="departCache"

这样这个方法返回值就可以被缓存起来的了,但是怎么样把缓存数据和数据库中的数据实现同步呢?

如果对这个PO做update,save,delete可以实现这样策略如下:

@Transactional(propagation = Propagation.REQUIRED)
 //设定spring的ecache缓存策略,当编辑机构时候,把缓存全部清除掉,以达到缓存那数据同步;
 @TriggersRemove(cacheName="departCache",removeAll=true) 
 public boolean editDepart(String depno, String depName) {
  boolean flag = false;
  try {
   AppDepart depart = departDao.getAppdepart(depno);
   depart.setDepName(depName);
   departDao.update(depart);
   flag = true;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return flag;
 }

好了到此配置完毕,但是更加详细缓存配置策略需要研究(例如:当update数据时候,不全部清掉缓存,就可以达到与数据库同步效果)

[url]以下配置经本人完成测试通过(只限于本版本)。

编写测试类

packagecom.dzf.cache;

importorg.springframework.stereotype.Service;

importorg.springframework.transaction.annotation.Transactional;

importcom.googlecode.ehcache.annotations.Cacheable;

importcom.googlecode.ehcache.annotations.TriggersRemove;

@Service

@Transactional

publicclassCacheService{

@Cacheable(cachename="testCache")

publicStringgetName(inti){

System.out.println("ProcessingtestCache");

return"nihao:"+i;

}

@TriggersRemove(cachename="testCache")

publicvoidflush(){

System.out.println("ProcessingtestFlushing");

}

}

很容易就把cache给管理起来了。相当的方便。

碰到问题:当在Hibernate也使用缓存的时候

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
		p:packagesToScan="com.pandy.ssh4.domian">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.SQLServer2008Dialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
				</prop>
				<prop key="hibernate.cache.use_structured_entries">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
			</props>
		</property>
	</bean>

会出现AnotherunnamedCacheManageralreadyexistsinthesameVM错误,又如何解决呢?

有必要在spring和hibernate都配置ehcache缓存么?

一个是针对数据库缓存,一个是针对业务数据缓存.

相关推荐