Hibernate二级缓存:类缓存,集合缓存,更新时间缓存,查询缓存
程序优化:缓存
hibernate:二级缓存.
集成spring的缓存模块(子项目)实现对service的缓存代理,降低数据负载压力.
--------------------------------------------------------------
1.引入类库
spring-modules-cache.jar
[第三方缓存供应商]
backport-util-concurrent.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
ehcache-1.5.0.jar
jsr107cache-1.1.jar
2.配置ehcache配置文件,指定缓存的过期策略.
[conf/ehcache.xml]
<ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStorepath="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<cachename="surveyCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
3.配置spring的缓存模块的配置文件
[conf/service-spring-cache.xml]
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springmodules.org/schema/ehcache
http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">
<!--指定ehcache的配置文件 -->
<ehcache:configconfigLocation="classpath:ehcache.xml"/>
<!--配置缓存代理 -->
<ehcache:proxyid="surveyServiceCacheProxy" refId="surveyService">
<!--缓存数据 -->
<ehcache:cachingmethodName="get*" cacheName="surveyCache"/>
<ehcache:cachingmethodName="load*" cacheName="surveyCache"/>
<ehcache:cachingmethodName="find*" cacheName="surveyCache"/>
<ehcache:cachingmethodName="is*" cacheName="surveyCache"/>
<!--清理缓存 -->
<ehcache:flushingmethodName="save*" cacheNames="surveyCache" />
<ehcache:flushingmethodName="update*" cacheNames="surveyCache" />
<ehcache:flushingmethodName="delete*" cacheNames="surveyCache" />
<ehcache:flushingmethodName="batch*" cacheNames="surveyCache" />
</ehcache:proxy>
</beans>
4.将service缓存代理注入给action
publicclass SurveyAction ...{
...
//注入缓存代理
@Resource(name="surveyServiceCacheProxy")
privateSurveyService surveyService ;
}
5.配置web.xml文件,一同加载spring缓存配置文件.
<!--通过上下文参数指定spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml,classpath:schedules.xml,classpath:service-spring-cache.xml</param-value>
</context-param>
使用spring3.0的cache方案解决缓存问题,应用参与调查模块
--------------------------------------------------------
1.抽取spring-cache-3.1.xsd文件进行注册.
org.springframework.context-3.1.0.RELEASE.jar/org.springframework.cache:缓存抽象包
xml头:
<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd "></beans>
2.配置beans.xml文件中的缓存通知和切入点
配置缓存通知
<!--缓存管理器工厂-->
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<!--ehcache配置文件,配置的是缓存的过期策略-->
<property name="configLocation" value="classpath:ehcache.xml"/>
</bean>
<!--ehcache缓存管理器-->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache"/>
</bean>
<!--自定义key生成器-->
<bean id="surveyKeyGenerator" class="cn.itcast.surveypark.cache.SurveyKeyGenerator"/>
<cache:advice id="cacheAdvice" cache-manager="cacheManager" key-generator="surveyKeyGenerator">
<cache:caching cache="surveyCache">
<!--缓存数据-->
<cache:cacheable method="get*"/>
<cache:cacheable method="load*"/>
<cache:cacheable method="find*"/>
<cache:cacheable method="is*"/>
<!--移除缓存数据-->
<cache:cache-evict method="save*" all-entries="true"/>
<cache:cache-evict method="update*" all-entries="true"/>
<cache:cache-evict method="delete*" all-entries="true"/>
<cache:cache-evict method="batch*" all-entries="true"/>
</cache:caching>
</cache:advice>
配置缓存通知切入点:
<!-- 缓存通知,只限于SurveyService的方法 -->
<aop:advisor advice-ref="cacheAdivce"
pointcut="execution(* cn.itcast.surveypark.service.SurveyService.*(..))"
order="0"/>
3.自定义key生成器.
public class SurveyKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object o, Method method, Object... objects) {
String targHashCode = o.getClass().getSimpleName() + "[+"+o.hashCode()+"+]";
String mname = method.getName();
String key = null;
if(ValidateUtil.isValid(objects)){
StringBuffer buffer = new StringBuffer();
for(Object p : objects){
buffer.append(p.toString() + ",");
}
key = targHashCode + "." + mname + "("+ DataUtil.md5(buffer.toString())+")";
System.out.println(key);
return key;
}
key = targHashCode + "." + mname + "()";
System.out.println(key);
return key;
}
}
spring远程调用:
------------------------
-----------server-----------
1.创建web项目
2.添加spring类库
org.springframework.aop-3.1.0.RELEASE.jar
org.springframework.asm-3.1.0.RELEASE.jar
org.springframework.beans-3.1.0.RELEASE.jar
org.springframework.context-3.1.0.RELEASE.jar
org.springframework.context.support-3.1.0.RELEASE.jar
org.springframework.core-3.1.0.RELEASE.jar
org.springframework.web-3.1.0.RELEASE.jar
org.springframework.web.servlet-3.1.0.RELEASE.jar
org.springframework.expression-3.1.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
3.创建接口和实现类
publicinterface WelcomeService {
publicvoid sayHello(String name);
}
publicclass WelcomeServiceImpl implements WelcomeService {
publicvoid sayHello(String name) {
System.out.println(name);
}
}
4.配置spring配置文件.
[web-inf/${servler-name}-servlet.xml]
<?xmlversion="1.0"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsd ">
<!--pojo -->
<beanid="welcomeService"class="cn.itcast.spring.rpc.service.WelcomeServiceImpl" />
<!--导出器,将pojo对象转变成controller,处理请求 -->
<beanname="/ws.service"class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<propertyname="serviceInterface">
<value>cn.itcast.spring.rpc.service.WelcomeService</value>
</property>
<propertyname="service" ref="welcomeService" />
</bean>
</beans>
-----------client-----------
5.创建java项目
6.引入类库
同服务端.
7.复制服务端接口到客户端.
8.创建src/client.xmlspring配置文件
<?xmlversion="1.0"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsd ">
<!--客户端代理 -->
<beanid="wsClient"class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<propertyname="serviceUrl">
<value>http://localhost:8080/lsn_springrpc_0909_server/ws.service</value>
</property>
<propertyname="serviceInterface">
<value>cn.itcast.spring.rpc.service.WelcomeService</value>
</property>
</bean>
</beans>
9.创建测试类
publicclass App {
publicstatic void main(String[] args) {
ApplicationContextac = new ClassPathXmlApplicationContext("client.xml");
WelcomeServicews = (WelcomeService) ac.getBean("wsClient");
ws.sayHello("tom");
}
}
10.运行
先启动服务器端
在启动客户端.
将项目中的统计服务对外公开,供第三方系统整合
-------------------------------------------
--------- server ---------
1.引入类库
org.springframework.web.servlet-3.1.0.RELEASE.jar
2.配置web.xml文件DispatcherServlet
<!-- 配置spring远程调用使用的分发器servlet-->
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:service-spring-http-inovker.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/*.service</url-pattern>
</servlet-mapping>
3.配置spring远程调用配置文件
[conf/service-spring-http-invoker.xml]
<?xmlversion="1.0"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsd ">
<!--远程调用统计服务类 -->
<beanname="/ss.service"class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<propertyname="serviceInterface"value="cn.itcast.surveypark.service.StatisticsService" />
<propertyname="service" ref="statisticsService" />
</bean>
</beans>
------- client ----------
4.添加客户端配置bean.
<!--客户端代理 -->
<beanid="ssClient"class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<propertyname="serviceUrl">
<value>http://localhost:8000/lsn_surveypark0909/ss.service</value>
</property>
<propertyname="serviceInterface">
<value>cn.itcast.surveypark.service.StatisticsService</value>
</property>
</bean>
5.测试
spring mvc配置文件自定义命名:配置初始化参数(contextConfigLocation)
<!-- 配置spring分发器servlet-->
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--通过初始化参数指定spring配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>*.service</url-pattern>
</servlet-mapping>