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

Hibernate本身不提供二级缓存,所以需要使用第三方插件来作为二级缓存;本次使用memcached作为Hiberbate的二级缓存:添加步骤如下:

一、需要安装memcached服务端

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 [email protected]

那恭喜您,您已经成功配置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,第一次之后的查询在缓存生命周期内都不用到数据库去取数据了。

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

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

时间: 2024-10-13 01:23:25

SSH整合缓存之-Memcached作为hibernate的二级缓存的相关文章

AWS中使用Memcached作为hibernate的二级缓存

我想做互联网的都会接触到云.认识的很多人他们用的阿里云,我们选择的是AWS . 我想国内用AWS的也会慢慢的增多,自动扩展服务器可以防止攻击,中国区第二个机房也已经建好了.保证了高可用.但是有一个问题就是论坛上资料全是英文的,这个一点没法和阿里云比,都是中文. 和大多数互联网产品一样,我们还处于初期开发阶段,但是用到的aws的服务还是很多的. 我们选择了Memcached作为haibernate的二级缓存,因为AWS本身托管Memcached服务,集群环境不需要我们自己搭建. 和大多数人一样,开

Hibernate的二级缓存

与Session的一级缓存相对的是,SessionFactory也提供了相应的缓存机制(二级缓存).SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在 Hibernate初始化阶段根据映射元数据推导出来的.SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义 SQL语句,因此SessionFa

Hibernate的二级缓存策略

Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象. 2) 把获得的所有数据对象根据ID放入到第二级缓存中. 3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查:查不到,如果配置了二级缓存,那么从二级缓存中查:查不到,再查询数据库,把结果按照ID放入到缓存. 4) 删除.更新.增加数据的时候,同

Hibernate的二级缓存使用(spring使用)

(一)Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象. 2) 把获得的所有数据对象根据ID放入到第二级缓存中. 3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查:查不到,如果配置了二级缓存,那么从二级缓存中查:查不到,再查询数据库,把结果按照ID放入到缓存. 4) 删除.更新.增加数据的时

【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样.那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响.那么使用Hibernate的二级缓存就可以解决这个问题. 有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中

hibernate(九) 二级缓存和事务级别详讲

序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人博客应该也差不多可以做出来了.基本上先这样定下来,开始完成hibernate的东西把.这章结束后,我会将我一些hibernate的资料奉上,供大家一起学习. ---WH 一.概述 这章总的分两大块来讲解, 第一大块,hibernate的事务管理.,对于hibernate的事务管理来说,如果之前学过数

Hibernate之二级缓存

Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据时数据存储源中数据的拷贝.缓存的物理介质通常是内存 Hibernate中提供了两个级别的缓存 第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存有Hibernate管理的 第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围的缓

配置Hibernate的二级缓存

1.在applicationContex.xml文件里面添加二级缓存配置: <!-- 配置hibernate的sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"><ref bea

hibernate的二级缓存----collection和query的二级缓存

collection二级缓存: 不使用集合的二级缓存时: 运行下面的代码: @Test public void testCollectionSecondLevelCache1(){ Department dept = (Department) session.get(Department.class, 3); System.out.println(dept.getId()+" "+dept.getName()); System.out.println(dept.getEmps().si