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的集成相关包
如果你的项目使用的是Log4j,可以用
最主要的是(里面就是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 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的二级缓存就算配置完成了!