项目要上线,这几天在搞缓存的问题,因为使用的是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似乎不负责缓存分页时候,查询数量的结果,不知道是么有用对,还是什么原因,等待以后解决吧!