分享

hibernate 配置memcache作为二级缓存

 yuhengli 2015-07-25
项目要上线,这几天在搞缓存的问题,因为使用的是ssh的框架,需要加缓存(memcached),于是上网找了下,发现网上都是千篇一律,虽然主要的也说了,但是,对于我这个新手,还是很多不了解的,于是乎自己总结多方说明和自己的研究结果!

    首先memcached的安装不说了!

    然后需要下载hibernate、memcache集成的相关jar包:

 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

最主要的是:http://code.google.com/p/hibernate-memcached/

 

hibernate的配置如下(配置在applicationContext.xml中):

<property name="hibernateProperties">
   <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.cache.use_query_cache=true
   hibernate.memcached.servers=localhost:11211
   hibernate.cache.use_second_level_cache=true
   hibernate.cache.region_prefix=quality.cache.ehcache
   hibernate.memcached.operationTimeout=30000

   </value>
  </property>

 

其它一些参数设置说明:

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()方法

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

 

(摘自:http://www./xmatthew/archive/2008/08/20/223293.html

注意:hibernate.memcached.operationTimeout单位应该是ms的,所以 本系统设置的超时时间是30s

配置好之后,将jar包加入项目中,启动服务,如果服务启动正常,说明配置已经完成!

然后就是最主要的了,需要在*.hbm.xml中加入<cache usage="read-write"/>

位置如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate./hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.g2us.article.entity">
 <class name="Article" table="arti_article">
  <meta attribute="sync-DAO">false</meta>

<!--id的缓存-->
  <cache usage="read-write"/>
  <id name="id" type="java.lang.Long" column="ARTICLE_ID"><generator class="native"/></id>
  <property name="title" column="TITLE" type="string" not-null="false" length="255"/>

<set name="comments" table="common_comment" cascade="all-delete-orphan">

<!--一对多缓存-->
   <cache usage="read-write"/>
   <key column="RESOURCE_ID"/>
   <one-to-many  class="com.g2us.comment.entity.Comment"/>
  </set>

 </class>
</hibernate-mapping>

 

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

配置查询缓存首先:  hibernate.cache.use_query_cache=true
然后,需要在查询时设置如下代码,

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

至此,hibernate+memcache的缓存配置完成!

不过有一点没搞明白,hibernate中的cache似乎不负责缓存分页时候,查询数量的结果,不知道是么有用对,还是什么原因,等待以后解决吧!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多