1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?>0 h: w8 ^0 G9 @1 B; N1 I
<ehcache>5 b1 g* i; `9 u9 P% r/ {# l
<diskStore path="java.io.tmpdir"/>" y" `: `3 D1 N: \1 ]0 @
<defaultCache
, Y# o; \; k- y0 H: N2 K7 f. e maxElementsInMemory="10000" <!-- 缓存最大数目 -->
; F6 u: @& k3 j) N6 x# L eternal="false" <!-- 缓存是否持久 --> overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
+ D+ H- j; L7 D9 u! q timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->; b8 m7 P" o! B
diskPersistent="false"
/ r8 Y9 V' c$ N' u7 X) N g diskExpiryThreadIntervalSeconds= "120"/>- Y1 T" |2 {: p/ k4 S* B, \0 k
</ehcache> 2、在hibernate配置文件中设置: <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
4 k3 v! I% \0 T4 @: i<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3 D0 |$ l: G# Z0 m7 k) w4 V <!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>% X+ T8 S1 Z. ]1 D a I
如果使用spring调用Hibernate的sessionFactory的话,这样设置:
$ j! M4 d$ L( A& Q- [: l <!--HibernateSession工厂管理 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">: f- V/ Z1 R5 h6 ?9 }
<property name="dataSource">
; m3 I; \8 v3 k$ h4 i" I <ref bean="datasource" />
5 t/ ]4 W( E9 {: V- P5 ? </property>
8 d9 c) A- \% C# E' R: \ <property name="hibernateProperties">' `! E4 N7 Y: P; T" E
<props>3 @0 ]& Z. i2 j$ @6 T
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>* F2 h6 {9 v8 h ]" A
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>" T9 L" b" e$ f5 x- m' a+ J. T
<prop key="hibernate.show_sql">true</prop>
`1 C$ A2 I \% z7 S, T; u <prop key="hibernate.cache.use_query_cache">true</prop>, I6 C& o! q7 h" W+ I( X9 {
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>0 L/ l8 Y% E0 n( @! K0 z2 d5 p
</props>
$ J# X7 @5 M2 j2 f8 r </property>
8 D3 m8 m. Z2 m+ Z) W9 W <property name="mappingDirectoryLocations">: g( I7 T0 y$ Z( u* o
<list>
! v* @8 s/ @' @) u <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
# X- O, N' u, ~: u9 p8 N$ ? </list>1 e, S! z' A, U+ o7 P
</property>
# g) E9 _6 b. y, ~# D/ c</bean> 说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 3、在Hbm文件中添加<cache usage="read-only"/>
) ?: n( V, z9 l; C 4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性
5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 package cn.rmic.hibernatesample; import java.util.List; import org.hibernate.CacheMode;$ L/ G: B( v' b) e: L7 |
import org.hibernate.Criteria;
# J: \6 t$ R7 A }% R6 \import org.hibernate.Query;8 Y- t5 Y3 C$ ?7 e) m
import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;/ n8 j$ S) W0 y
import cn.rmic.manager.po.Resources; public class testCacheSelectList ...{ public static void main(String[] args) ...{
' Y6 i- g) ?7 I5 \$ c6 [2 x Session s=HibernateSessionFactory.getSession();5 } Y2 r+ G) E& G7 X. i
Criteria c=s.createCriteria(Resources.class);
2 p! H0 b( L- m5 ~3 L6 p7 A" e2 n c.setCacheable(true);
, w' h6 a0 \7 k$ B! F/ q+ \% r0 M List l=c.list(); Resources resources=(Resources)l.get(0);% H1 A' e' N! m2 Q
System.out.println("-1-"+resources.getName());6 Q/ t' z) S2 ?) W l; n- N
HibernateSessionFactory.closeSession(); - Y$ l2 o5 _2 C4 R6 i
try ...{
; m3 ~, @ \* k# U8 K# B Thread.sleep(5000);( ~, ~/ A2 T& [' g( [
} catch (InterruptedException e) ...{
" Q j& O N$ o7 o! F8 z7 ^7 I // TODO Auto-generated catch block
1 b, e3 s2 r/ v- {/ y e.printStackTrace();
2 m% t8 J$ ?( x }
* ^) i' L' ?7 m* w s=HibernateSessionFactory.getSession();1 j7 u- e% S/ y) b6 Q
c=s.createCriteria(Resources.class);
$ f5 v- c" M4 L. ~' ~# C8 L c.setCacheable(true);9 m5 _7 |( Z/ [7 Z! Z9 Y
l=c.list();- d, P/ _- ^- }, {6 g/ k
resources=(Resources)l.get(0);
- ?# U! _6 \* o* ^% y System.out.println("-2-"+resources.getName());0 l, O( m, \4 b. p, o4 e* p' X+ L
HibernateSessionFactory.closeSession();
" i& d s6 l! b/ l9 B* q }2 t6 t' [, _3 X5 t, s! v' C
} 8 s" b+ T9 H5 T$ F
1. 在Hibernate配置文件中设置:
) I) \4 F# J. p6 h <!-- Hibernate SessionFactory -->
4 Y" K, `( X4 w4 g! t! z. n, b <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
$ Z/ {9 ? e3 r1 U$ f! M; `4 X <property name="dataSource" ref="dataSource"/>
+ R1 E4 |$ B/ N, j( f0 O <property name="mappingResources">
$ K6 m: I" \! k/ V$ U1 K <list>, ^, I" R5 u- L8 `4 s
<value>com/ouou/model/Videos.hbm.xml</value>
9 F9 O( k4 e+ }5 z6 S </list>0 _8 ]0 _3 X% @ M
</property>. Q( o+ b0 I3 b8 I
<property name="hibernateProperties">2 D. C: A: S6 Z; m
<props>
7 V% U/ C6 h4 d9 b+ g <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
\& ~$ x! T1 b, y0 Y& [ <prop key="hibernate.current_session_context_class">thread</prop>
* S/ W4 [( R: h k; g <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>+ T* e- _. |% V# [; ^0 s/ E$ T
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
! s H5 u+ Q+ s) ^) P0 G6 m1 b <!--add ehcache-->+ r, S% E3 m {' \1 D" b
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>( i- ^# a8 |! v- i) |3 y9 |
<prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查询缓存 -->- K& P& r2 t; x. m; ?- q. J( u- M
<!--( `+ @9 Q+ z) E A$ l. s$ u
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
5 [/ s$ N# K0 ]. w7 f6 |! J S <prop key="hibernate.show_sql">true</prop>
5 Q Z+ n/ \2 E; [ -->( v, Y. x" I6 P3 [% v
<!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->8 w# O- }1 H0 m
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
0 H* f4 m) Y0 o <!-- Create/update the database tables automatically when the JVM starts up
8 p @& n" ]* q6 d6 q7 C( Q <prop key="hibernate.hbm2ddl.auto">update</prop> -->
5 v, h. k7 Z9 {3 }! A C ? <!-- Turn batching off for better error messages under PostgreSQL -->/ h& q, X( k! V C
<prop key="hibernate.jdbc.batch_size">25</prop>% |& M I$ ~9 | C% f; J
<!--1 Z% E0 R& q: o1 m* w
<prop key="hibernate.connection.pool_size">10</prop>2 M' [( M% K6 k0 V% A
-->
- \8 D, M6 ?/ M2 { </props>
& Q: e) Z6 }6 g* w3 z </property>
: l5 r$ K1 Y- W( ~; u2 m </bean> 如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: ( ]. e3 M( i, {1 n# Q# A) {- Y
<ehcache> <!-- Sets the path to the directory where cache .data files are created. If the path is a Java System Property it is replaced by
u* v0 v- ~& e- x4 O its value in the running VM.
# `; F8 `+ i, i: x# { The following properties are translated:
7 _# u1 r/ y8 K" ]$ x0 |% ~ user.home - User's home directory5 [. N, |$ g! ~. c
user.dir - User's current working directory. v3 S6 X* M, _ U/ a
java.io.tmpdir - Default temp file path -->4 I! v# F0 J8 }+ V j' D# @/ c
<!--<diskStore path="java.io.tmpdir"/>-->3 q+ k; z4 F( ]4 C* k& k
<diskStore path="/data/ehcache"/> <!--Default Cache configuration. These will applied to caches programmatically created through' |8 c- m9 O" ]7 N9 i% A% K
the CacheManager. The following attributes are required: maxElementsInMemory - Sets the maximum number of objects that will be created in memory+ S1 O6 c F4 B( f+ R8 s
eternal - Sets whether elements are eternal. If eternal, timeouts are
6 \& y( c1 E/ Z6 ]% }* F ignored and the element is never expired.) h9 g- p5 {7 F
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache5 N% V0 T6 J! F0 }% v# p$ K
has reached the maxInMemory limit. The following attributes are optional:
) k, [! G# v! u8 G5 Q timeToIdleSeconds - Sets the time to idle for an element before it expires.5 ?/ v p8 b# J4 z7 v. ~9 F
i.e. The maximum amount of time between accesses before an6 q5 Z0 W2 g9 P' y% u7 p
element expires Is only used if the element is not eternal.- |/ q1 S' j' k7 Z( e
Optional attribute. A value of 0 means that an Element can idle
# t9 m+ f) A( d7 i3 u for infinity.The default value is 0.# j* t. o' p3 m' h% h
timeToLiveSeconds - Sets the time to live for an element before it expires.
, K. y. H1 O0 w7 f0 A i.e. The maximum time between creation time and when an element
* \7 G$ v3 i1 f5 R, r3 m% B3 R7 p expires. Is only used if the element is not eternal.
+ C( }9 O7 c9 |) } Optional attribute. A value of 0 means that and Element can live
8 r- {* n; Q& R% H; O7 q3 J% q for infinity.
1 C+ T. q9 q% K) q$ l The default value is 0./ U0 T; n0 @6 P4 v# ?# t* T
diskPersistent - Whether the disk store persists between restarts of the Virtual
S, h* l. G) g X" `( s Machine.
& P2 ]* ]3 A% @ The default value is false." T0 A- x& A/ t: ?6 T5 c( p, H% Y
diskExpiryThreadIntervalSeconds - The number of seconds between runs of the disk expiry thread.
2 O/ H0 Q6 r7 k& C1 Y The default value is 120 seconds.
/ \2 X( M" d0 O- Z% x2 L( u) ? --> <defaultCache9 ?! w+ \" L- l7 j* `5 O' h
maxElementsInMemory="10000"
- e6 K u/ f1 V# z eternal="false": y1 ~; e3 c2 ?. G
overflowToDisk="true"& X7 v O* C: ^
timeToIdleSeconds="120", U& `% t5 h6 @& t# ^0 T
timeToLiveSeconds="120"/ b! p& \- U1 s i( I7 L
diskPersistent="false"
& U5 b4 B3 J$ {2 Y diskExpiryThreadIntervalSeconds="120"/>
/ h( V0 T4 m d) T; G <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000"
2 f! J2 v- k: E0 B eternal="true" overflowToDisk="true"/>
. I H0 x: g- W, | <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"
; L# i# U2 v% j R4 l! }: V# Z timeToLiveSeconds="120" overflowToDisk="true"/>
3 ]$ \9 A8 Z1 B6 N! O <cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=+ i7 u8 f8 C- N/ @
"600" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>! d( U/ n: E8 g/ i7 Z
<cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000"0 H( S3 d. v$ v3 Z8 P
eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false"" j* i9 D( l$ T2 E! q& k
diskPersistent="false"/>
) A h8 J! o5 o' X% u4 L, j <cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600"
; `& t8 x1 S( D$ |6 I, m timeToLiveSeconds="600"
' E1 W! n+ W* `. R. ~ V overflowToDisk="false" diskPersistent="false"/>
) Z& L3 n( t9 B, k3 p% S <cache name="com.ouou.model.Videos" maxElementsInMemory="10000" eternal="false"+ p( @6 l z, I# Q- H
overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>9 M- N9 ?6 L6 ]2 z8 s; E$ b
<cache name="com.ouou.model.Tags" maxElementsInMemory="10000" eternal="false"
- {9 d( r/ Y% g, q1 Q- [5 p overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>$ S+ e& U% I; b# W4 g
</ehcache> 以com.ouou.model.Videos为例子
x6 v2 ^& @7 l+ [+ x/ L+ ^, H在Videos.hbm.xml中配置:
9 |5 k$ W$ d1 e<class name="Videos" table="TEST" lazy="false">. f! d x+ y8 y2 g, f2 o$ b
<cache usage="read-write" region="ehcache.xml中的name的属性值"/>注意:这一句需要紧跟在class标签下面,其他位置无效。 x( a2 K* ~2 Y( L( ^
hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,; Y5 m- n4 B. ?2 m
如果不存在与类名匹配的cache名称,则用defaultCache。
6 T9 z9 X! K. Y- a9 b如果Videos包含set集合,则需要另行指定其cache1 w0 L4 ^8 X" i
例如Videos包含Tags集合,则需要
7 K$ c' Q' P' c2 |添加如下配置到ehcache.xml中
6 J a& |6 q9 \1 \<cache name="com.ouou.model.Tags"; g% d8 d2 f* l `: ~- ]$ a
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"/ q e* Z1 ~8 A \
timeToLiveSeconds="120" overflowToDisk="false" />' C, S6 ]) J* A; {9 V( d
另,针对查询缓存的配置如下:
% F9 f0 A, H& j# X0 I) @<cache name="org.hibernate.cache.UpdateTimestampsCache"
. s- X# f1 T z3 C& @* S maxElementsInMemory="5000"/ ]# s \/ U2 i2 D+ A
eternal="true"' v; x# p% w9 k, L, E4 R
overflowToDisk="true"/>8 L7 S& B* }2 i9 L
<cache name="org.hibernate.cache.StandardQueryCache"
1 @7 f2 H3 z2 S3 W: r maxElementsInMemory="10000"
% K2 t8 a4 @$ z' f/ {, b% ` @ eternal="false" s& l: T1 i) k/ C' H
timeToLiveSeconds="120"
! o& Q! }& ]$ @7 d- ? overflowToDisk="true"/> 3、 选择缓存策略依据: <cache usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>6 E# S1 I4 v8 o1 J- C/ q
ehcache不支持transactional,其他三种可以支持。
1 F) Z5 J6 ~6 P$ e. E9 I5 G7 [3 Nread-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,5 z" K8 O8 R! J# {$ K
但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。, u' J: k, |- S7 x8 }
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level
6 J4 c. w& V7 i( D4 ^$ N(序列化事务隔离级别)
% b8 J5 D. Y: x5 J6 q$ r- _8 O* wnonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,
% Q/ a, R$ r9 F0 k+ T那么比较适合使用非严格读/写缓存策略。 4、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。 5、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (" u5 g" ?4 L4 v
org.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。4 z/ R( ^! a2 M" I, I5 ]
请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。
9 l4 A8 S( N/ C8 Y需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。
0 O6 R/ T& x' E8 zEhcache的配置说明 ! t, U9 E7 n( w! o
<ehcache>" X! }5 p `+ b! u: u- ^
<!--
Y& |( c' S" \' \$ u; V$ P+ G0 J l磁盘存储配置:
# `+ x5 P' s! G" f$ c' x1 K& ?用来指定缓存在磁盘上的存储位置。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)
7 O1 ~6 ^4 r2 K# W& J-->0 i9 }/ m: n; K' U- I" L
<diskStore path = "/var/apps/cache/" />5 }8 T- S) d; `3 R
<!--
3 I) X2 C' x3 Q$ k0 N0 F指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知
/ h( r3 y" u R8 p. o' r8 d9 }& s% iCacheManagerEventListenerFactory的属性
' } M1 e9 g% r" {*class - CacheManagerEventListenerFactory的一个实现类$ G. f& k8 T. A& f. X
*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性& @$ W3 e; s3 n. o! Y1 X/ g
如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值* ~2 k8 n# ^! [: v" m2 L3 Z: l
-->
, o( S2 ^ x2 e& v) j<cacheManagerEventListenerFactory class="" properties="" />6 {( \. d( V1 K5 N } o$ u* p: H/ m
<!--
6 y& y: o- E0 p6 |, o( N在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory,' `! Q' r2 {9 |* O6 R, p4 r
用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。$ w- c# N- i {$ u
*class -CacheManagerPeerProviderFactory的一个实现类" y& l, Z( ^+ s- l) z
*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性! k. P; g1 h$ [' P r
Ehcache内建了2种基于RMI分布系统的通信策略:9 Q% ?5 q' e. b1 t
*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应' n7 p. s$ R, T" s
*manual - 硬编码方式 目前的awf中不考虑分布缓存& U0 n8 N( Z2 |) S5 l' C
-->
. f" {0 u6 U4 F8 \) g6 a<cacheManagerPeerListenerFactory class="" properties="" /> n9 h9 ?& f% B; ]
<!--3 t$ K; H+ T3 I# |
缓存配置。7 W7 w# ]7 m9 I J1 k
以下属性是必须的:3 y8 ]$ N. R( d7 r0 I3 u, d8 e0 \
name - cache的标识符,在一个CacheManager中必须唯一
" [' _) p( Q2 P2 R4 D9 ]2 o0 smaxElementsInMemory - 在内存中缓存的element的最大数目
( J$ L: [! u! YmaxElementsOnDisk - 在磁盘上缓存的element的最大数目
5 S2 Y. K: u/ s! @, Y3 oeternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略( a& N# a6 B9 Y6 D3 c
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上0 X: T' M( j3 {9 S2 A7 _6 F
以下属性是可选的:
( B9 t" v- e+ @4 C8 f1 x* y& ytimeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间.
0 O0 U+ s7 C3 u0 k0 Y (如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)
( W- m& i* B3 p5 dtimeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期
1 A% g7 V1 r$ b6 K# R# ^ (是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)
2 g0 K: M9 D8 c# F& @. wdiskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。
) x1 d( V9 C' l! Z1 j# P (测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)! d; m, @) n2 p- j" p s
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒.
3 |& s. T+ T: k! h- |. ? (测试一下0的时候会如何)
$ r4 i$ T6 `7 X8 UmemoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,5 W; X5 V y- a, B5 e
移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO 可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些6 W7 }# c; L5 _& ~
*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件
+ _" }2 B2 W+ Y X# ]7 `*bootstrapCacheLoaderFactory - 启动时加载缓存的element
( ~/ J% U( ?3 V' H每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。
7 p! F7 U$ b3 u" uEhcache内建了基于RMI的实现 - RMICacheReplicatorFactory% U3 H8 q* X7 g+ f. z
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
% s' B) }; c6 M+ \ properties="replicateAsynchronouly=true,) {$ D- a$ W) @
replicatePuts=true,
, a$ g4 O3 M& n' a8 K replicateUpdates=true,# Y, [- @! V" u) X0 u
replicateUpdateViaCopy=true,
, v8 k6 H: d5 g! W replicateRemovals=true" /> -->
3 a' X E9 N2 {2 j, k) a) b( `<cache .... />5 o( c+ N; X- N5 ?* _
<!--0 L2 w A1 j W o: T1 S
默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存- h. Y6 D& |9 W, k8 W
-->) t! f! z x: w1 A3 _" { ]
<defaultCache maxElementsInMemory="10000" eternal="false"% E, P% ?1 T% Z* m
timeToIdleSeconds="120" timeToLiveSeconds="120"6 T& e% u( Y, `3 o
overflowToDisk="true" maxElementsOnDisk="1000000"
% k! `2 j7 h( V l diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
: e2 W6 ?0 Y, |+ D memoryStoreEvictionPolicy="LRU") ?) @; `7 y$ o* ~* f
/> </ehcache> + x% _$ V% l; i9 ]( u
|