yuxing 发表于 2015-8-31 10:38:15

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

  这次是我要做的毕业设计,其中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
  其它一些参数如下:
PropertyDefaultDescriptionhibernate.memcached.serverslocalhost:11211  memcached 服务地址,
  多个用空格分隔 格式host:port
hibernate.memcached.cacheTimeSeconds300缓存失效时间,单位秒hibernate.memcached.keyStrategyHashCodeKeyStrategy  缓存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.hashAlgorithmHashAlgorithm.KETAMA_HASH  新增缓存数据到服务
  器时使用的Hash散列
  算法。 当
  hibernate-memcached
  设置成 KETAMA_HASH
  算法时,注意:默认客户
  端API使用的是
  HashAlgorithm
  .NATIVE_HASH
hibernate.memcached.clearSupportedfalse  支持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 class="native" />
      </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 class="com.hwadee.entity.Fimlcomment" />
      </set>
  </class>
</hibernate-mapping>
  这样hibernate就会在取id的时候,从缓存中读取数据,但是到此为止,并未完成配置查询缓存!
  在查询时代码要加入(前提是配置查询缓存时:hibernate.cache.use_query_cache=true):
  Query query = getSession().createQuery(finder.getOrigHql());
query.setCacheable(true);//这样才能使查询的时候调用缓存!
  这样,memcached作为Hibernate的二级缓存就算配置完成了!
页: [1]
查看完整版本: hibernate 配置memcache作为二级缓存(Spring、Hibernate集成在applicationContext.xml中)