首页 > 代码库 > SSH整合缓存之-Memcached作为hibernate的二级缓存

SSH整合缓存之-Memcached作为hibernate的二级缓存

1. 下载memcached的windows稳定版,

(本次测试使用下载memcached http://www.newasp.net/soft/63735.html)
2. 在CMD下进入memcached解压路径:输入 memcached.exe -d install" 安装.

技术分享

 


3. 再输入:memcached.exe -d start" 启动,可以看到进程中多了memcached。

NOTE:1、 一定要开启memcached服务;2、以后memcached将作为windows的一个服务每次开机时自动启动。

二、导包

commons-codec-1.3.jar

hibernate-memcached-1.2.2.jar(很多文章中少了这个,导致失败!)

memcached-2.1.jar

spy-2.4.jar

slf4j-api-1.5.0.jar

三、修改配置文件

1、applicationContext.xml

 <property name="hibernateProperties">             <!-- hibernate memcached 二级缓存 -->          <value>            hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect            hibernate.show_sql=true            hibernate.format_sql=true            hibernate.query.substitutions=true 1, false 0            hibernate.jdbc.batch_size=20<!--默认的数据库-->            <!--配置Hibernate使用cache提供类-->               hibernate.cache.provider_class=com.googlecode.hibernate.memcached.MemcachedCacheProvider            <!-- 开启Hibernate的二级缓存 -->              hibernate.cache.use_second_level_cache=true            <!--设置查询缓存开启-->            hibernate.cache.use_query_cache=true            <!-- 设置memcached缓存服务器的端口 -->                hibernate.memcached.servers=localhost:11211              <!-- 设置二级缓存的前缀名称 -->                hibernate.cache.region_prefix=quality.cache.ehcache               <!-- 否使用结构化的方式缓存对象  -->               hibernate.cache.use_structured_entries=true               <!-- 操作超时时间设置,单位ms -->               hibernate.memcached.operationTimeout=300000               <!-- 缓存失效时间,单位秒 -->               hibernate.memcached.cacheTimeSeconds=300           </value> </property>    

更多详细的参数请参考http://code.google.com/p/hibernate-memcached/wiki/Configuration

此时启动tomcat服务器,console假如有如下的信息,

2013-07-20 18:29:42.426 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
2013-07-20 18:29:42.426 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@8c4549

那恭喜您,您已经成功配置memcached作为二级缓存了!但是此时还不能使用memcached。

2、修改数据表映射文件*.hbm.xml

只需在需要缓存的字段前加上<cache usage="read-write"/>,根据不同的需求,usage可改为read、write

<hibernate-mapping package="com.xxx.xxx.xxx">    <class name="xxx" table="xxx_xxx">        <cache usage="read-only" />        <id name="id">            <generator class="native" />        </id>        <property generated="never" lazy="false" name="title" />        <property generated="never" lazy="false" length="50000" name="content"            type="text" />        <property generated="never" lazy="false" name="faceIcon" />        <property generated="never" lazy="false" name="postTime"            type="timestamp" />        <property generated="never" lazy="false" name="ipAddr" />
3、查询语句前

加上query.setCacheable(true);//这样才能使查询的时候调用缓存!要对查询设计到的所有方法添加开启二级缓存

技术分享

OK,此时应该是可以使用memcached作为强大的二级缓存了!

四、案例

技术分享

第一次点击搜索按钮,console输出信息为

Hibernate:     select        department0_.id as id21_0_,        department0_.name as name21_0_,        department0_.principal as principal21_0_,        department0_.description as descript4_21_0_,        department0_.parentId as parentId21_0_     from        suma_department department0_     where        department0_.id=?Hibernate:     select        department0_.id as id21_0_,        department0_.name as name21_0_,        department0_.principal as principal21_0_,        department0_.description as descript4_21_0_,        department0_.parentId as parentId21_0_     from        suma_department department0_     where        department0_.id=?

第二、三、四...次点击搜索按钮,console输出信息为:

就没有sql语句的打印信息:页面依旧正常能查询到数据,说明memcached二级缓存添加成功

Ok,第一次之后的查询在缓存生命周期内都不用到数据库去取数据了。

骚年:已经成功了,还等什么?

参考地址忘记了 :-----

SSH整合缓存之-Memcached作为hibernate的二级缓存