hibernate 配置memcache作为二级缓存(Spring、Hibernate集成在applicationContext.xml中)

作者: Darrenda
发布时间:2015-07-08 18:37:01

  这次是我要做的毕业设计,其中memcached-2.5和hibernate-memcached-1.2.2的源代码在网上都可以找到。让memcached作为Hibernate的二级缓存做法比较简单,但想深入了解memcached或者Hibernate-memcached的原理,可参照网址:

memcached完全剖析:http://kb.cnblogs.com/page/42731/

Hibernate-memcached的源代码:http://code.google.com/p/hibernate-memcached/

好!以下是memcached作为Hibernate二级缓存的做法:

一、memcached的安装

  先下载memcached(注意版本)并安装,详情请参照:http://www.cnblogs.com/Darrenda/articles/memcached_for_java.html

二、下载memcached、Hibernate的集成相关包

  memcached-2.1.jar

  spy-2.4.jar

  commons-codec-1.3.jar

  slf4j-api-1.5.0.jar

  如果你的项目使用的是Log4j,可以用

  slf4j-log4j12-1.5.0.jar

  最主要的是(里面就是Hibernate-memcached的源代码):http://code.google.com/p/hibernate-memcached/

三、hibernate的配置如下(配置在applicationContext.xml中,以MYSQL为例):

<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
    <!--Oracle中有MySQL中没有这种优化 -->  
    hibernate.jdbc.fetch_size=50
    <!--默认的数据库-->
<!--    hibernate.default_schema=mbp-->
    <!--配置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

其它一些参数如下:

Property Default Description
hibernate.memcached.servers localhost:11211

memcached 服务地址,

多个用空格分隔 格式host:port

hibernate.memcached.cacheTimeSeconds 300 缓存失效时间,单位秒
hibernate.memcached.keyStrategy HashCodeKeyStrategy

缓存Key生成存储

HashCode算法

hibernate.memcached.readBufferSize

DefaultConnectionFactory.

DEFAULT_READ_BUFFER_SIZE

从服务器读取数

据缓存区大小

hibernate.memcached.operationQueueLength

DefaultConnectionFactory

.DEFAULT_OP_QUEUE_LEN

Maximum length of

the operation

queue returned by

this connection

factory

hibernate.memcached.operationTimeout

DefaultConnectionFactory

.DEFAULT_OPERATION_TIMEOUT

操作超时时间设置
hibernate.memcached.hashAlgorithm HashAlgorithm.KETAMA_HASH

新增缓存数据到服务

器时使用的Hash散列

算法。 当

hibernate-memcached

设置成 KETAMA_HASH

算法时,注意:默认客户

端API使用的是

HashAlgorithm

.NATIVE_HASH

hibernate.memcached.clearSupported false

支持MemcachedCache

.clear()方法

清空缓存。 建议不要开启。

将相应的包放进lib下,并启动服务器,提示信息如下:

2012-12-08 18:32:46.908 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=localhost/127.0.0.1:11212, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
2012-12-08 18:32:46.992 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@895684
2012-12-8 18:32:56 org.Apache.coyote.http11.Http11Protocol start

 表示我们配置已经成功了,然后就是要对*.hbm.xml中加入<cache usage="read-write"/>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.hwadee.entity.Film" table="film" catalog="mbp">
        <!-- id的缓存 -->
       <cache usage="read-write"/>
        <id name="filmId" type="java.lang.Integer">
            <column name="filmId" />
            <generator />
        </id>
        <property name="filmName" type="java.lang.String">
            <column name="filmName" length="1024" />
        </property> 

   <set name="fimlcomments" inverse="true" cascade="all">
            <!-- 一对多的缓存 -->
         <cache usage="read-write"/>
            <key>
                <column name="filmId" />
            </key>
            <one-to-many />
        </set>

  </class>
</hibernate-mapping>

这样hibernate就会在取id的时候,从缓存中读取数据,但是到此为止,并未完成配置查询缓存!

在查询时代码要加入(前提是配置查询缓存时:hibernate.cache.use_query_cache=true):

Query query = getSession().createQuery(finder.getOrigHql());
query.setCacheable(true);//这样才能使查询的时候调用缓存!

这样,memcached作为Hibernate的二级缓存就算配置完成了!

来源:http://www.cnblogs.com/Darrenda/archive/2012/12/08/hibernate

推荐: