1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?>* T8 G. t7 r1 ~9 H& {
<ehcache>
4 P" n3 ]1 r& r5 f <diskStore path="java.io.tmpdir"/>: A- a! r: O) e B# A, H
<defaultCache( d& g H" m1 F: c$ O3 s: E& p7 _4 ]
maxElementsInMemory="10000" <!-- 缓存最大数目 -->
! F3 M% X6 l! \- d7 r) q; G eternal="false" <!-- 缓存是否持久 --> overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
6 D/ e% ]' p+ J5 F2 o timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->* L; @; b/ `* U5 m8 u
diskPersistent="false"
% ?- _- k& M) ]! i) { n4 R% ` diskExpiryThreadIntervalSeconds= "120"/>! n! z* o6 X* K; _( M! u; L, J
</ehcache> 2、在hibernate配置文件中设置: <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->- f7 z2 `3 D/ V; B6 F8 V
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
, |9 Y! B3 k7 e& [. z! g <!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>
0 P" K# ?, ?5 C. O/ o; J 如果使用spring调用Hibernate的sessionFactory的话,这样设置:3 U/ x) ~% z$ h: F' c1 ]5 L
<!--HibernateSession工厂管理 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
; z7 v: \" ~/ [) Q* r! a <property name="dataSource">9 u A/ m' z2 T) l; Q \# c2 B% K
<ref bean="datasource" />
& I. x$ {, s, z/ U; G% } </property>
: @8 h. U! s" c0 B \ <property name="hibernateProperties"># v% T$ S9 f% r3 G9 p% G% ~
<props>+ J! J$ e: w+ ?
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
: Q" J: |; y" a- e, K' t) } <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
2 P7 b, w* g Z0 r; _2 t' u <prop key="hibernate.show_sql">true</prop>
) h- x3 f2 ], G; ~0 q8 y <prop key="hibernate.cache.use_query_cache">true</prop>1 q. G" ~, I/ B, J, L; h$ l) W
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
! j% ^6 V+ X! E( w0 F' | </props>
) l9 i3 J5 ] Z7 X# B </property>
0 _: d0 I- h9 N& m0 ^- ~ <property name="mappingDirectoryLocations">1 f0 l* F! Z& W
<list>- ~1 ]+ h$ N2 z9 e/ j
<value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>+ j2 @+ ^' A" [. D" F3 ~$ r% d
</list>* D9 n$ o8 p4 e0 F% g' |* C6 N
</property>
2 e. [6 F8 r1 k; S& A</bean> 说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 3、在Hbm文件中添加<cache usage="read-only"/> * P% }4 z H, l" J
4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性 5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 package cn.rmic.hibernatesample; import java.util.List; import org.hibernate.CacheMode;) w+ r" N7 I% f! d( m% L
import org.hibernate.Criteria;
; s$ W9 k: y& I5 H% N" i$ Oimport org.hibernate.Query;# e- S/ ]3 R' \! i( U* E0 i
import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
0 I% g3 o& E3 _8 m/ B2 y2 ?% Kimport cn.rmic.manager.po.Resources; public class testCacheSelectList ...{ public static void main(String[] args) ...{
4 M. l' O- {5 m Session s=HibernateSessionFactory.getSession();5 Y% R* C) a# R3 a1 ]( y- b! ]. c
Criteria c=s.createCriteria(Resources.class);
: u/ y' a" C; }+ U! |2 @7 S c.setCacheable(true);; K9 g5 r. l: G9 r6 U3 \7 Q2 i1 E
List l=c.list(); Resources resources=(Resources)l.get(0);
5 P. K& @% C+ P4 O" L3 v System.out.println("-1-"+resources.getName());
: t, R- X" l5 t7 |: F$ q" ^' S HibernateSessionFactory.closeSession();
4 f. R7 {$ z" K$ s5 N7 J0 }( H try ...{% {& C8 }6 M; ~8 R& M3 _/ s
Thread.sleep(5000);! y/ _* ?* x! }8 ~1 Q3 u+ ~
} catch (InterruptedException e) ...{
- N- k5 A6 S( ? // TODO Auto-generated catch block
# J( @ z* x" i6 b4 ^; p e.printStackTrace();
0 ` u e% a- E4 a' h: T }. Y' T: V9 l+ m* X" Y. S
s=HibernateSessionFactory.getSession();
& O. ]7 u, L$ `0 Q c=s.createCriteria(Resources.class);0 \4 G" d, r9 Q4 I
c.setCacheable(true);, x, u! `. G; |2 p8 Y
l=c.list(); N" G' e4 v3 C
resources=(Resources)l.get(0);! `" L/ u0 p- \+ f
System.out.println("-2-"+resources.getName());8 @2 j% O$ G* A* h; ^/ W, o: X
HibernateSessionFactory.closeSession();
- I Z$ n: W: r# a* I- d }: Y% J9 k8 `7 J0 a6 B
}
5 E7 u J3 W6 `2 j( X+ x$ R1. 在Hibernate配置文件中设置:
7 V0 K2 B" ^( e1 ?, Y: W <!-- Hibernate SessionFactory -->
. B% \9 x" x0 L2 t3 m1 B" G <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
% ~. L. ^2 u; N) b# N1 g <property name="dataSource" ref="dataSource"/>4 J/ e- { j' E# j" t
<property name="mappingResources">1 |1 K, s1 L* h1 J. M; p. u
<list>
" U( H8 P7 U+ a3 ? w9 B( C& k1 u <value>com/ouou/model/Videos.hbm.xml</value> , d- U& U m/ A. ]' e5 c {
</list>
; D! X$ F( [1 {% z( o </property>7 S, A( o: N; V7 p
<property name="hibernateProperties">9 a! {. B( d8 [/ }
<props>
1 [3 B3 M7 e5 Q <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
- y; W+ F5 f( c$ Y4 `% W <prop key="hibernate.current_session_context_class">thread</prop>
) ]" Q( y+ S1 I" y <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>- {2 X) x: N) p+ l" Q& @: t
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>& N5 Y. d& b4 o" q, C
<!--add ehcache-->
' M$ P9 n6 E. s- p+ V2 X9 d& d9 t <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>: S1 C$ \1 ~, T3 Y. p
<prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查询缓存 -->
( m% e& G* T2 N8 q <!--$ w$ Q" d5 J9 ]
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
* X7 e* J; I6 Q" a! `; G <prop key="hibernate.show_sql">true</prop>0 y3 O5 b/ f# @1 |
-->( T9 ?& e9 {. J
<!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->
; c( a/ g1 u- z) M' T5 R! m <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>' t1 e4 Y6 W: `
<!-- Create/update the database tables automatically when the JVM starts up
9 O) y3 R6 R' K* E <prop key="hibernate.hbm2ddl.auto">update</prop> -->( H7 V9 d" J. M2 B! y1 o$ L$ }
<!-- Turn batching off for better error messages under PostgreSQL -->
0 A1 M( _1 r% w- P4 C2 \: X9 v <prop key="hibernate.jdbc.batch_size">25</prop>
' g/ U1 Q+ ]: W <!--3 e/ y/ z+ b, f0 p6 ~
<prop key="hibernate.connection.pool_size">10</prop>1 P2 X/ g" _5 O; s3 t
-->
) u4 _8 e" N3 A" t, J9 e/ g </props>
* ^3 @3 U: M3 F </property>
8 T* @9 g8 R6 C) W0 ` Y </bean> 如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
& {" [- f |, A r4 m! \4 o* 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
( A, [& _+ W" |: s* L& L its value in the running VM.
: b: t6 @4 |" g1 J5 p8 a: J The following properties are translated:
8 u' C. Q) ]5 L user.home - User's home directory9 L# Q7 V1 e% q
user.dir - User's current working directory
2 ]0 S9 v# C6 k0 A) X java.io.tmpdir - Default temp file path -->
: X) V8 \' G9 Z t4 n. n0 B <!--<diskStore path="java.io.tmpdir"/>-->' W" q. P- e# J4 Y* [# T
<diskStore path="/data/ehcache"/> <!--Default Cache configuration. These will applied to caches programmatically created through# l$ C/ I- ^, ]0 L7 f+ B
the CacheManager. The following attributes are required: maxElementsInMemory - Sets the maximum number of objects that will be created in memory
! ~( }1 A" D4 u" j/ J/ s eternal - Sets whether elements are eternal. If eternal, timeouts are R2 k: i, o2 Y F* f5 m1 ~9 E2 ^
ignored and the element is never expired.3 Y: p8 x6 @( X' [
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache0 d# Q2 k6 ~3 [4 r: {% i
has reached the maxInMemory limit. The following attributes are optional:. o% W% ^0 y7 \* L5 t+ h
timeToIdleSeconds - Sets the time to idle for an element before it expires.
& a( y; |+ P- P! x4 L, r0 K i.e. The maximum amount of time between accesses before an3 B* V! U7 p3 d8 `3 q: T5 [2 T
element expires Is only used if the element is not eternal.
- U; d# E6 X, E _6 F Optional attribute. A value of 0 means that an Element can idle
( M0 m; K5 z- w, a6 p+ F" R* u for infinity.The default value is 0.
8 l9 W$ v `) w/ X8 K. i/ v& H timeToLiveSeconds - Sets the time to live for an element before it expires.4 v5 w! J+ b% |
i.e. The maximum time between creation time and when an element
" u m$ L6 o3 @+ }- O expires. Is only used if the element is not eternal.- @+ Y. A4 d! T/ q; p4 Y3 e8 Q' V
Optional attribute. A value of 0 means that and Element can live2 s+ m8 A% U% e d y
for infinity.9 g( K3 I( o9 B
The default value is 0.4 t6 d# J" b, r% k+ _! |$ k4 X- ^2 i
diskPersistent - Whether the disk store persists between restarts of the Virtual, `, _( X' s$ z6 W6 |* L# q
Machine.+ Q( g; z, j, Q7 {0 C
The default value is false.
. o6 y3 U# M. Z3 q* B m1 u5 f diskExpiryThreadIntervalSeconds - The number of seconds between runs of the disk expiry thread.+ z/ G' [1 W2 R
The default value is 120 seconds.
, [9 _* i* D0 N/ z1 y- N --> <defaultCache2 @ U5 z7 |2 {7 c
maxElementsInMemory="10000"% |- e4 D( S" r
eternal="false"
7 r0 p) B* K3 l overflowToDisk="true"
3 U* i7 a1 M$ Y$ P$ @' P ?3 Y timeToIdleSeconds="120"4 a! E4 a) s0 Y* B2 b- t4 G
timeToLiveSeconds="120") |/ ~" n$ p( c8 I0 u+ X2 [ h
diskPersistent="false"
( e$ S8 P2 C0 G4 J ~: X n+ i diskExpiryThreadIntervalSeconds="120"/>
, |; ~) L0 K8 b! A' \ <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000"
$ k, P8 P0 b& j! ` eternal="true" overflowToDisk="true"/>' w; j o7 Q8 N* | R
<cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"2 J' K* e- f( A/ ^: V% q* J
timeToLiveSeconds="120" overflowToDisk="true"/>
3 @5 p) G) d0 Z. V# p <cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=
P% U# X7 K' X( Z/ P "600" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>7 |0 Z! p% _* F
<cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000"
1 k) p7 d- N2 d7 j' e eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false"6 u% k; j) s7 I9 a5 C
diskPersistent="false"/>% C- b# _' V( b4 p
<cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600"! a7 M# i. @* G' n
timeToLiveSeconds="600"
7 `) c1 l. w7 [ N3 k, E( r overflowToDisk="false" diskPersistent="false"/>% H. M+ x5 A7 }, p
<cache name="com.ouou.model.Videos" maxElementsInMemory="10000" eternal="false"
+ e# y Z! m$ T5 Y+ q8 \ overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>9 h, `8 n A. D7 z6 x) W5 T
<cache name="com.ouou.model.Tags" maxElementsInMemory="10000" eternal="false"+ S8 r2 q4 e' d3 Q7 b$ I' G
overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>
3 m4 r) M$ H6 U1 d8 J</ehcache> 以com.ouou.model.Videos为例子; z0 `. c0 G' D, \1 p3 m4 I
在Videos.hbm.xml中配置:
0 G8 }* I. [, p3 ]/ i! L2 r; ~<class name="Videos" table="TEST" lazy="false">
% l" Y, t* U k' j+ b* D <cache usage="read-write" region="ehcache.xml中的name的属性值"/>注意:这一句需要紧跟在class标签下面,其他位置无效。7 {9 r* e3 |: }, ]
hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,
% c U) T9 V4 I# ^, {( t如果不存在与类名匹配的cache名称,则用defaultCache。
) o8 {+ S; C! a" W$ ^" k如果Videos包含set集合,则需要另行指定其cache a+ Z4 p* V* B* S
例如Videos包含Tags集合,则需要; X; a& }' f( s
添加如下配置到ehcache.xml中7 w& z0 _( i3 d# W
<cache name="com.ouou.model.Tags"9 e! t2 r' `4 z. M2 j
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"5 l, i2 Y/ [0 O% N f5 _
timeToLiveSeconds="120" overflowToDisk="false" />: p! k/ v, B( b/ i3 V7 v
另,针对查询缓存的配置如下:2 p8 M& ^ [! p2 I1 w8 e+ n! |
<cache name="org.hibernate.cache.UpdateTimestampsCache"6 `! ]" b) l f2 x
maxElementsInMemory="5000"
, N W1 \2 l% l) C; h' U eternal="true"
1 G% e" V# q) V4 |. L! z+ s/ R8 w; s overflowToDisk="true"/>
' b/ v% E" @/ ~' j6 i8 i<cache name="org.hibernate.cache.StandardQueryCache"
- \- f) I0 B# Z4 N1 O3 F/ z/ T maxElementsInMemory="10000"! \5 E* n$ k4 N) Z7 b5 Z( I+ W2 b
eternal="false"7 o* p$ y2 f. p6 B7 o6 N
timeToLiveSeconds="120"
: q$ U1 y+ g% }6 j2 ]" H- a3 n overflowToDisk="true"/> 3、 选择缓存策略依据: <cache usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>- ^2 R4 c: a3 k! `+ R, ?! V
ehcache不支持transactional,其他三种可以支持。9 L* [; r S% b$ g! k7 g
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,4 P" |, \- h; P2 n% P: g% j* Y: b
但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
" T5 _# M# t+ Q/ E) F @/ U3 I( ?/ aread-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level2 S9 I3 C& V. C
(序列化事务隔离级别)
8 X& I$ S+ j* I' \% V: |nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,- S7 R# o0 t$ ?8 g: g
那么比较适合使用非严格读/写缓存策略。 4、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。 5、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (
7 ], t! d2 g" rorg.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。' Y. ?* y4 ?7 D% N) j; ?- ~
请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。
3 |, L. G: B: p0 t需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。 5 g) g$ O9 v6 y$ p& F) @
Ehcache的配置说明 C q, m/ q9 Z
<ehcache>- q0 f. G. z( x4 @
<!--+ r) c) v4 u: ]; b' H f1 R
磁盘存储配置:
2 g/ H# m! y& B& |8 U用来指定缓存在磁盘上的存储位置。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)
6 y( q) e$ G; p- W-->0 V& ^0 {; T4 {6 e; \
<diskStore path = "/var/apps/cache/" />0 b3 z( u# _# b: p# P; D+ N
<!--
: f: U. D2 }: u- O0 ], u9 i1 d: ~6 B指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知/ l- N5 }3 c- z" _2 e
CacheManagerEventListenerFactory的属性
1 ]1 [( \2 E" j- G) y1 l*class - CacheManagerEventListenerFactory的一个实现类
9 |& T. s0 m5 T" Q*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性. X' R5 A8 o) B3 ]3 \) R
如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值, Q- }9 o# F' H }# R$ `
-->5 e6 j9 l. D( y7 M$ l' E" z, p
<cacheManagerEventListenerFactory class="" properties="" />
" D% C [* b. K! ?3 @<!--
. w- k7 B3 w2 e" h) X7 q, ^* M% r在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory," }4 V$ ]. u& E$ {5 W
用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。
3 J$ w8 ^/ z5 a4 @) Z5 ~*class -CacheManagerPeerProviderFactory的一个实现类+ G* O8 b; {. ]( W0 m x
*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性
0 N/ a% f/ p/ r9 M" A7 uEhcache内建了2种基于RMI分布系统的通信策略:
% O: f2 f5 l+ f3 L5 @+ c*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应
1 [; ?6 q7 V2 A; z9 D' X*manual - 硬编码方式 目前的awf中不考虑分布缓存5 H& J5 |# I7 r" a c( z0 m
-->: ]$ K! A C5 m2 w* D
<cacheManagerPeerListenerFactory class="" properties="" />& b% v$ b& l3 [ q6 `2 n7 n% p
<!--
: T$ ]* V; p0 g. T5 w8 t9 f缓存配置。0 o6 s' t" j* J9 w
以下属性是必须的:1 x- v8 t0 ^3 @7 v# Z# o8 c
name - cache的标识符,在一个CacheManager中必须唯一
( I& [# B; k' j1 j' {maxElementsInMemory - 在内存中缓存的element的最大数目
8 F& o& L+ M. x1 [; ^& xmaxElementsOnDisk - 在磁盘上缓存的element的最大数目
2 l4 I0 b) {0 peternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略
+ r; h. ^9 Q% v1 X% QoverflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
( |; u. ~' E: \) }( @以下属性是可选的:
: q7 j* E* k' d8 ^7 ^- TtimeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间.; e I$ q/ y" @: ^ t7 s; M& I
(如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)
7 _; @5 Y* I6 ItimeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期
0 K9 X: A9 w0 T4 Z1 I (是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)5 C* i, W+ B {' T- g' d
diskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。9 k1 Q- b! [9 D3 B; {8 F
(测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)
6 o) @% K6 g# d& [diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒.
" q9 P% X; R* a (测试一下0的时候会如何)
/ X+ R d: g( n4 I$ @# [8 j& v0 E9 q8 BmemoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,
3 W t5 ]) K& I 移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO 可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些5 W6 d k2 D* k( p1 F
*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件+ |* [" P0 i# d- o
*bootstrapCacheLoaderFactory - 启动时加载缓存的element& {; M& a! s7 a4 ?% T: M8 H2 k
每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。: A* T6 ~$ \, |* |, Y
Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory1 V# Z2 s2 W7 _; q) g2 }
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"! n9 f% ~2 F8 R4 m6 q8 M8 H9 M
properties="replicateAsynchronouly=true,' i; {: y3 w' f+ M
replicatePuts=true," y3 c: {3 F& Y2 @
replicateUpdates=true,
[2 y1 f8 W: T8 i. f replicateUpdateViaCopy=true,2 ^% q4 X! P* m$ ]/ v
replicateRemovals=true" /> -->/ b3 F6 ]3 j& o$ i$ n. a
<cache .... />
' z* |( p U5 p6 @$ z<!--" { q {/ z) g4 K6 }
默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存3 ^2 o, ?; k2 l; E/ l' Y
-->
, M& n( p$ R! }' L<defaultCache maxElementsInMemory="10000" eternal="false"
6 n- [# X5 {6 X: N: R) f/ m; E timeToIdleSeconds="120" timeToLiveSeconds="120"# ^" D, f C' h
overflowToDisk="true" maxElementsOnDisk="1000000"
1 o Y j# @( [8 f4 k" }/ j diskPersistent="false" diskExpiryThreadIntervalSeconds="120"& n8 J4 \( {8 z0 | ^; y9 I _6 e
memoryStoreEvictionPolicy="LRU"9 x* P$ Q/ U0 H% s
/> </ehcache> {$ P* M. B$ [, J1 q9 G% C! ]5 N
|