1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?>
+ A) J) P/ ^: _<ehcache>
- B" O1 O8 q4 I9 ]; N* e <diskStore path="java.io.tmpdir"/>
& R. O2 r1 F& _) w; k( ~: {4 q <defaultCache& r& y; @& b, x
maxElementsInMemory="10000" <!-- 缓存最大数目 -->6 T8 n5 n4 e! v- o! t- w/ C
eternal="false" <!-- 缓存是否持久 --> overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
8 E! p6 s) D& Q, j' B4 }; v; E timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->
8 \4 w/ W1 K& O$ O2 H- }( v diskPersistent="false"
2 U: q3 r& |$ a3 ?- y" c diskExpiryThreadIntervalSeconds= "120"/>$ s" G3 Q% [$ H: Z( |7 _5 h
</ehcache> 2、在hibernate配置文件中设置: <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
$ G3 N: E" T1 l: m/ }: _4 R<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
0 r3 n* f3 l& }9 V) c+ b( s4 x9 I3 y <!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>
' i1 _' Q( _& z# i& V/ S4 Y 如果使用spring调用Hibernate的sessionFactory的话,这样设置:8 H& R" \8 o+ a6 W" X0 y
<!--HibernateSession工厂管理 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">0 J* ?5 ?- G8 J, f6 m9 p
<property name="dataSource">
* A+ k1 R* m. y <ref bean="datasource" />, Q; R, n& M6 n% t: B1 d
</property>+ h9 p: F. [, S6 e7 Y
<property name="hibernateProperties"># m+ S( d7 _6 j1 c2 O& y$ U
<props>
' i% o* f6 d3 K% R# i$ Q; L# `, C <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>) R( @: M5 x6 F. H, w% p/ e
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>5 [$ Y' E% \6 H2 g5 ?
<prop key="hibernate.show_sql">true</prop>
7 g% i1 n! K. N3 j <prop key="hibernate.cache.use_query_cache">true</prop>' l ]2 K4 K; @0 L* R" r+ v" f$ ?3 }
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>4 v4 h; x) Q4 l0 a% L8 T J
</props>$ o5 W9 O- O7 L. [% v) U$ {+ ^- S
</property>
5 ~6 ?$ j& H/ | L <property name="mappingDirectoryLocations">* ^! s9 D3 i1 U7 x/ Y- x
<list>: G. y! E/ f( @% X2 z
<value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>. G) d: t9 I! \! l: j
</list>4 S9 i; S6 e+ j* T
</property>
( j4 _& k( G8 J, F</bean> 说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 3、在Hbm文件中添加<cache usage="read-only"/> ) C0 _# a1 ^0 b1 l* G9 A6 t
4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性 5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 package cn.rmic.hibernatesample; import java.util.List; import org.hibernate.CacheMode;
: }6 Q. h4 T9 |2 y& h$ W3 Bimport org.hibernate.Criteria;6 j" |. ^% E7 F: N1 Q6 h6 @ H
import org.hibernate.Query;! s& D& u9 R& [( U8 N5 m
import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
: Q& ], v3 }! L4 ?import cn.rmic.manager.po.Resources; public class testCacheSelectList ...{ public static void main(String[] args) ...{0 @ M) }: C, d& Y+ g
Session s=HibernateSessionFactory.getSession();' M: [# C7 N/ V! v& O# H; u# |
Criteria c=s.createCriteria(Resources.class);
1 s! V) I" D4 u- | c.setCacheable(true);
/ Q, B8 _' ?% e' j* w List l=c.list(); Resources resources=(Resources)l.get(0);
) ~( ~% x/ |. f8 P( e# H+ j) j System.out.println("-1-"+resources.getName());. m7 t( F- D; \' ]1 P7 e$ ]
HibernateSessionFactory.closeSession(); : ?. [: @# w0 H4 `9 A# W
try ...{4 ] j# U+ q: D+ I( J
Thread.sleep(5000);
7 o' a \* X, W+ ^ } catch (InterruptedException e) ...{
& M% Y( R: @0 [) t% F // TODO Auto-generated catch block
1 N5 p. j9 L3 p0 F# e( y e.printStackTrace();$ r& T7 S; o, {: ^
}# }6 x) U0 s+ q, k3 o. p, ~. y
s=HibernateSessionFactory.getSession();
: i9 u' w" v5 H c=s.createCriteria(Resources.class);) T" J6 D, U6 k( W$ k7 a7 y% L
c.setCacheable(true);
9 g* `8 n+ E) F7 x( D$ n/ y l=c.list();5 k* A2 I; {! Z5 H& j$ G. w8 E. H
resources=(Resources)l.get(0);
; e- p6 J$ @" f6 d" a1 B System.out.println("-2-"+resources.getName());4 P. L/ M3 y. e) i% _
HibernateSessionFactory.closeSession();
# X$ c3 `' K- U- O* } }$ o/ t" v( t' J! c0 N
} $ T: C" o. S5 }/ p" J' q* }& p
1. 在Hibernate配置文件中设置:( V8 V& h0 @2 Y
<!-- Hibernate SessionFactory -->/ N7 o& \5 h5 o6 l
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">, P' ? r4 |# S( i
<property name="dataSource" ref="dataSource"/>
9 I& @" R# h9 a' ~, S <property name="mappingResources">
/ f5 G* I2 J* Q8 @9 K, i <list>6 J: |% q7 M* X- G
<value>com/ouou/model/Videos.hbm.xml</value> $ P% k6 P6 ], V }+ K
</list>4 o7 W* V Q$ N5 k2 I
</property>
0 F& h0 X0 t. l0 j' O <property name="hibernateProperties">
j/ [: V1 g# H! `* n, D/ p <props>
7 c3 b8 J7 d6 R* x! ~3 F7 T <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>3 k3 b, M5 P4 w& Z
<prop key="hibernate.current_session_context_class">thread</prop>; X9 d2 d4 e3 X6 B' \2 w
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>7 F4 _: B) o ^! x2 I
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
( x+ n7 v$ O7 c6 p- o0 y. l' ~4 w; G <!--add ehcache-->
2 z* ?' A& J4 i+ H; Y% ~ <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>- u- z, U# ?4 m- q. y# ^3 w
<prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查询缓存 -->
( v: \# u" n r1 i8 o <!--
. J& E" I* N! ^; f <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
' m1 X- A4 D5 t- |6 X, K! | <prop key="hibernate.show_sql">true</prop>
8 Z0 u. N0 f9 f: q! c2 T -->. a3 Z! {' S8 V: D
<!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->5 \7 ]% I$ q5 ~5 q9 K/ [+ j
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
( M' U6 w8 N; J" S i <!-- Create/update the database tables automatically when the JVM starts up
* B' V% c, k" s B4 u9 C <prop key="hibernate.hbm2ddl.auto">update</prop> -->- i7 l) i: r7 W- i0 i
<!-- Turn batching off for better error messages under PostgreSQL -->
5 l9 J1 o+ T; W2 _2 @ <prop key="hibernate.jdbc.batch_size">25</prop>
8 i5 a0 O2 V! w: j4 z4 }, S <!--
! ]; ~( X4 e6 J. d* `) n. F: b) O6 b <prop key="hibernate.connection.pool_size">10</prop>
$ v' i9 ~% c, N3 X9 E) L+ o -->( H" D* s5 [; w, {. ^0 N8 ?6 Q
</props>2 J7 {. |3 C- i/ [: o: B
</property>" e& p6 [0 P+ C; u; b
</bean> 如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: ' K9 T6 K* L9 z( k: E9 l
<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
+ s& i* L' q; Q1 a9 v its value in the running VM.' F: h& Z) N) t R4 @: ^
The following properties are translated:" @* `: ^' g$ X% o8 \
user.home - User's home directory7 p( }3 A4 D0 J1 q
user.dir - User's current working directory
' f6 l4 |, r: v# ^ java.io.tmpdir - Default temp file path -->
. t' d/ ~6 y9 c0 S <!--<diskStore path="java.io.tmpdir"/>-->* X7 c% e$ O) L4 ?. C! X% g, m
<diskStore path="/data/ehcache"/> <!--Default Cache configuration. These will applied to caches programmatically created through/ H8 R, X7 ]$ [) r( N# S# X
the CacheManager. The following attributes are required: maxElementsInMemory - Sets the maximum number of objects that will be created in memory! i# `4 ^9 h# |: V
eternal - Sets whether elements are eternal. If eternal, timeouts are
% M9 P' G* z W; B* V0 z ignored and the element is never expired.
$ `4 O% p& U. a% W overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
( U' a* A3 d: Q( B7 E) @ has reached the maxInMemory limit. The following attributes are optional:
+ G2 c# G g' z9 x timeToIdleSeconds - Sets the time to idle for an element before it expires.
4 g" c4 n* p: b i.e. The maximum amount of time between accesses before an
8 @% `/ q& U) A. V' H element expires Is only used if the element is not eternal.! H) L; u! s, t) Y9 ]- |( { n+ m& Q
Optional attribute. A value of 0 means that an Element can idle
; R+ Y: M. s0 `8 G for infinity.The default value is 0.
4 I1 c! y* q0 |8 \; t y* }6 n' ` timeToLiveSeconds - Sets the time to live for an element before it expires.5 v; i& Q0 J: z" L
i.e. The maximum time between creation time and when an element0 l a- w! x0 R# P7 x) k( u
expires. Is only used if the element is not eternal. n( J; u+ |' n" H4 N, m1 J
Optional attribute. A value of 0 means that and Element can live! Y$ |( {6 Y% X# ~* h/ j! R4 _
for infinity., p. r" `; W; O
The default value is 0.
5 H# b2 p$ P( \- w diskPersistent - Whether the disk store persists between restarts of the Virtual
/ Z6 H6 }! t/ j" I8 v Machine.$ |3 N. e4 }6 |6 J" b0 C( a A9 [
The default value is false.
. E: L# I2 V+ w1 v, }& f diskExpiryThreadIntervalSeconds - The number of seconds between runs of the disk expiry thread.1 G4 s* T V! a1 [+ J! j u1 i! E) L
The default value is 120 seconds.7 s: |4 a" a; i0 Q* t; i3 Q9 |2 v
--> <defaultCache) ]4 S$ U% t9 m) F/ }
maxElementsInMemory="10000"
. X+ e$ A" W8 l5 A eternal="false"" U# G2 J0 P7 m! y5 p) c, V8 L
overflowToDisk="true": A e% C. w7 G1 F4 {9 i' r
timeToIdleSeconds="120"# I+ X/ f% q' B c: Y: F. E
timeToLiveSeconds="120"- N7 q$ w7 V" `6 O5 `1 |- p
diskPersistent="false"
: I1 A* i& \' _ K# D8 f diskExpiryThreadIntervalSeconds="120"/>
, Q; L2 C$ w1 l- r B2 G: O' b <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000"$ U5 r* \0 H+ W2 c8 }: H
eternal="true" overflowToDisk="true"/>
# b* x N+ @8 D/ T2 c- D8 R1 ^6 W <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"
3 Q* N+ n0 J/ A timeToLiveSeconds="120" overflowToDisk="true"/>
' @( N( p5 _$ B$ G0 ]% v <cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=# N0 j+ h4 e m; ?2 f! E8 ] ]
"600" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>
7 d/ M/ c6 A7 V% k) X3 H <cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000"; J- ^3 N$ i5 c$ m
eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false", @1 J: M3 U/ A1 ~ Q* v, X
diskPersistent="false"/>. ^5 P4 C4 ^# I7 ?; r7 f
<cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600"
& r" T, f) N$ _5 E& f, ?4 ` timeToLiveSeconds="600"
9 e* n- N6 Q& s6 a overflowToDisk="false" diskPersistent="false"/>
- a2 h- k9 n1 S! E6 Z7 i) s) x <cache name="com.ouou.model.Videos" maxElementsInMemory="10000" eternal="false"1 F+ p1 ?) i" n
overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>, L) ~2 C' ^8 @
<cache name="com.ouou.model.Tags" maxElementsInMemory="10000" eternal="false"& S1 ^# J$ ~# Z: K; b
overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>+ M5 N8 k# {! \+ A$ w
</ehcache> 以com.ouou.model.Videos为例子
& q; w1 u ]) K4 Y在Videos.hbm.xml中配置:# R m* k' C0 R. L3 I
<class name="Videos" table="TEST" lazy="false">
' V9 p6 @7 A2 ]) d# n4 l0 m <cache usage="read-write" region="ehcache.xml中的name的属性值"/>注意:这一句需要紧跟在class标签下面,其他位置无效。2 N0 S3 M* ~ _6 T) g1 `
hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,. z5 p, g. z$ a6 I) T/ z
如果不存在与类名匹配的cache名称,则用defaultCache。: z, ]6 z- q: C7 A$ e# | Z) s
如果Videos包含set集合,则需要另行指定其cache, S0 p/ X4 u) q9 {2 i" C
例如Videos包含Tags集合,则需要
6 D5 `6 {" f0 l( f添加如下配置到ehcache.xml中$ l! a- n& G: H" O1 _
<cache name="com.ouou.model.Tags"# G! H& }+ g- ]8 U5 m/ d
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"0 n- F- ~4 f% u3 ^) y4 J: ^7 p
timeToLiveSeconds="120" overflowToDisk="false" />3 P$ Q& B+ n; k g+ {
另,针对查询缓存的配置如下:
$ @3 V/ O, a/ ? `: |" l3 d' z" e" \<cache name="org.hibernate.cache.UpdateTimestampsCache"
6 m- B& L4 H6 V+ U; l maxElementsInMemory="5000"
( ?0 b- P* j k+ U* Z eternal="true", o$ A3 L/ l, E; R
overflowToDisk="true"/>
* X- e# Q6 n M! g7 }2 ?* i<cache name="org.hibernate.cache.StandardQueryCache"% }+ t' H5 z, u/ ?( g
maxElementsInMemory="10000"4 ?$ s# G. p: M3 C# q! J3 r* [+ c
eternal="false"
8 I/ O; ~3 R7 f) p+ N) [ timeToLiveSeconds="120"% ?" E! }1 o% d1 y" V1 d( f
overflowToDisk="true"/> 3、 选择缓存策略依据: <cache usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>3 }* J, R) d8 ~) x J( l
ehcache不支持transactional,其他三种可以支持。' `/ f2 L/ q/ y
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,
( E q4 M+ e3 c- L但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。0 p% R; k N* H# K' T2 Z. V
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level
! h i6 W" a$ r7 \+ [(序列化事务隔离级别)
" W+ X; g# }2 Znonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,+ J: r! \ F0 Z; X0 c
那么比较适合使用非严格读/写缓存策略。 4、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。 5、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (
' A' k" R% r/ z2 r- o( y5 morg.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。
% `+ v# _* p9 y& y8 h请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。
/ N) O6 E& d' \9 Z3 \+ r需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。
& X0 y3 U* E4 s6 k: kEhcache的配置说明
/ [" s9 f9 |$ { ]# _<ehcache>
/ [: Y$ A D4 A: {9 y {# w3 ^* z }/ u<!--$ h L A5 ~* R7 k2 \" x! u
磁盘存储配置:& Y: b" e, C6 m8 s1 Y- G
用来指定缓存在磁盘上的存储位置。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)- |8 d g8 Q: Z$ p! C! W' m
-->- V. C S/ c9 F
<diskStore path = "/var/apps/cache/" />5 n9 a/ J' c) n0 y+ Q0 q' M
<!--
9 H6 s4 z+ U4 s% s" w指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知
2 p8 }( y3 w, ]! X3 L f& F$ n& RCacheManagerEventListenerFactory的属性
& o- }* W) Y5 B*class - CacheManagerEventListenerFactory的一个实现类
; w0 w: x3 a9 \6 e) ?: p7 i% c: s+ V*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性
0 H g g. i; g4 Z$ r8 {* C3 H, r如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值3 x# r8 @0 Z' ?8 p& s) a- F
-->
9 `* h" g6 Y: b1 p% h* F1 n<cacheManagerEventListenerFactory class="" properties="" />
1 |. h. s* f9 `, w N$ i<!--
1 G, c& ^% U( v' T) f在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory,, A/ W" j5 S+ O9 D/ m
用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。
2 P l0 n3 ]. F% w0 k2 E*class -CacheManagerPeerProviderFactory的一个实现类& Q# Z8 A0 C$ D' E8 e3 U% m
*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性
/ G' s3 F: I& r4 JEhcache内建了2种基于RMI分布系统的通信策略:
# S3 M* |" [6 s*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应
8 U& L% W7 E# Y& e* t4 J*manual - 硬编码方式
目前的awf中不考虑分布缓存
9 z! L2 s0 c( S- W, p; k-->: d) }& P) Y, B- U$ ~- O
<cacheManagerPeerListenerFactory class="" properties="" />" D5 ?2 c% g( ^) p" P+ D
<!--& `0 q5 y9 k' |" F1 C6 E
缓存配置。
9 U$ [8 P; C8 j以下属性是必须的:
M i" V5 K! L# Q: w+ \( w* Sname - cache的标识符,在一个CacheManager中必须唯一1 {2 n1 z& f5 N# m* D) l
maxElementsInMemory - 在内存中缓存的element的最大数目% {: d/ f$ L/ n. U
maxElementsOnDisk - 在磁盘上缓存的element的最大数目2 P n8 Q, g4 c
eternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略* c1 x$ D7 o" q3 [8 x
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上0 |: n; I% C- @* ?" y9 h
以下属性是可选的:
G! {7 }8 J) {! \. @timeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间., g* R9 `8 W* u* a. ^
(如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)
! I% m0 u4 e/ c, n5 Y7 ^timeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期* k; P/ q: V# h+ b+ a- R
(是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)
2 I" w; p3 _ N8 Y6 m( ^* IdiskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。
: ^# L0 p1 P. F$ }5 m) M6 ^' U8 [2 S (测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)
" T+ V/ S, I1 a/ f8 XdiskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒.
* O, m6 }1 q4 Z W& g5 u/ L4 S (测试一下0的时候会如何)
& ]& L5 `: m$ qmemoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,; n6 ^* B+ Y; Z! a$ w4 k, V
移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO 可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些, ]0 L6 J$ l. H+ J7 _9 e; f! d
*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件
' p; c) ]% H" c0 G0 S*bootstrapCacheLoaderFactory - 启动时加载缓存的element" ?) N4 E7 F8 E! R7 I+ z' \
每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。
: i V) d/ x& e" `Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory* v: f7 `3 W1 s+ q! | N
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"! h6 E; [% {$ r- M" C
properties="replicateAsynchronouly=true,# T" _0 R! p4 B$ V; {1 A5 x
replicatePuts=true,8 \/ V! y; a* z4 J u9 X
replicateUpdates=true,
+ D6 P0 U% W5 r( f replicateUpdateViaCopy=true,3 G6 o% \' c# o1 Y3 Q& M
replicateRemovals=true" /> -->
- X$ Q7 P% G# _4 k4 y* C2 W: v4 W% T<cache .... />
* v0 E' n* W7 E. R" K1 {<!--, {5 a' e/ N! w
默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存
, M: e. _6 r) Y-->
) Y9 s3 Y# C) ^$ J# V3 i" E5 m; f<defaultCache maxElementsInMemory="10000" eternal="false"
. n3 c0 E g% s# J& w timeToIdleSeconds="120" timeToLiveSeconds="120"
. a+ D# O" A9 o overflowToDisk="true" maxElementsOnDisk="1000000"
; z5 a! ^. _. A) K1 R0 a% T diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
5 M1 j! o. {1 _ memoryStoreEvictionPolicy="LRU"
- h" M4 _, O; Q0 `; W( | /> </ehcache> ) ` T* M8 y0 ~6 j" _8 k, C; b6 d
|