1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?>
, ^5 L$ {& x/ K8 E! W<ehcache>
: E' P# D% `, q5 {* D <diskStore path="java.io.tmpdir"/>2 ]; F# I% F* R- N0 h: P4 @; q8 j
<defaultCache
' ]- ~4 F0 S' u3 R6 K F maxElementsInMemory="10000" <!-- 缓存最大数目 -->$ |8 X3 x" c; p1 ?( F4 A3 M0 D4 w
eternal="false" <!-- 缓存是否持久 --> overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->9 L# R' G; Y5 Y5 |2 D# X8 U& z
timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->$ D, K8 }" }8 J: F4 h2 Y* u
diskPersistent="false"% [# B% s) \5 f4 W' f
diskExpiryThreadIntervalSeconds= "120"/>
4 N- y, T# j x9 z* |</ehcache> 2、在hibernate配置文件中设置: <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
/ d6 i( O- v3 Z; p* R; O<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>* e4 o" ?& M+ m" c
<!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>
+ c0 J$ S% I8 [4 g* B2 Z8 Q. F 如果使用spring调用Hibernate的sessionFactory的话,这样设置:
w2 |% _) W @& ~8 g <!--HibernateSession工厂管理 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
6 ~: b5 k, @/ s; d: q <property name="dataSource">
2 A; U; l$ }4 _7 z <ref bean="datasource" />
3 Z* H% ~7 R% M8 N </property>
/ [/ L% z4 f! L! b, P. b, I <property name="hibernateProperties">/ J0 c7 P+ Q5 `$ \1 I: M
<props> U$ J5 s6 ]5 r, B, ]# b4 c
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>" C. O# p+ `; J- v) a0 S8 L$ W
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>7 `' A7 \) F. d
<prop key="hibernate.show_sql">true</prop>
~7 {/ n& u* ?: s3 V9 b f <prop key="hibernate.cache.use_query_cache">true</prop>
5 f* x; Z& S/ _& }& d <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
7 V; T* o+ ~& K, m7 p* e! j9 g* s) _ </props>
/ s- F* B2 c) [, p* l8 A </property>
3 C B: }) U# R1 W! r <property name="mappingDirectoryLocations">
9 e& z' s3 F) p4 r3 s/ k4 ^ <list>
. R- ^8 U+ ?5 w% e6 t <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
6 F# e8 p: r8 s# k* J </list>
" d! h4 _$ |+ O) b </property>
# e3 u! v0 `1 z! P" N</bean> 说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 3、在Hbm文件中添加<cache usage="read-only"/> % Y+ D! ~# R1 d4 I! b1 N
4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性 5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 package cn.rmic.hibernatesample; import java.util.List; import org.hibernate.CacheMode;
& D3 D% }! `* q& Q& l* C% kimport org.hibernate.Criteria;, V8 w2 C1 k& o( T, x( u
import org.hibernate.Query;* \, G( n# ?5 S- k A% n9 W7 \ A
import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
7 b1 j: H& L: m/ Himport cn.rmic.manager.po.Resources; public class testCacheSelectList ...{ public static void main(String[] args) ...{
% C( @, Z" X; f* }2 j Session s=HibernateSessionFactory.getSession();
* {) V$ H/ j6 r( | I% Z Criteria c=s.createCriteria(Resources.class);2 {0 W3 q1 \8 k
c.setCacheable(true);5 E) Q3 J) w. Q6 L5 M5 Y/ E
List l=c.list(); Resources resources=(Resources)l.get(0);
! A# \% q4 v$ c Q" \# [% x System.out.println("-1-"+resources.getName());
& J: |/ U+ i: a3 y: L' x y HibernateSessionFactory.closeSession(); : e9 B' \9 t4 n% V- [
try ...{" X) l/ i* X2 |6 @. p6 A% g4 @
Thread.sleep(5000);
" A! }2 [: }* t0 a; L2 R' o6 y* S } catch (InterruptedException e) ...{9 W0 @. ~" g4 `. b! n
// TODO Auto-generated catch block! h- B$ _9 L+ |4 }( S1 ~
e.printStackTrace();) G0 P/ y5 v5 k4 W
}
6 p- d4 F4 c. U* J/ U( V' W" n s=HibernateSessionFactory.getSession();' C0 _ S7 h# @, ]8 K
c=s.createCriteria(Resources.class);
; x. a: u u6 o& ~4 y2 u7 h* R c.setCacheable(true);
8 N% D9 F) t" j8 u% _* w7 c l=c.list();- V1 C) A- E& g( ^, }; D% ~, o
resources=(Resources)l.get(0);
5 S; p" F$ D0 e) z: A System.out.println("-2-"+resources.getName());( z/ Y" I5 t4 v9 B9 J# U8 B
HibernateSessionFactory.closeSession();
' T& Q/ v( D% l4 @4 n }
3 n5 t/ H/ [& a2 c0 S) W, |, i( K) w}
5 V) k& a& m+ h1. 在Hibernate配置文件中设置:+ |1 _! t$ u7 q! k
<!-- Hibernate SessionFactory -->
2 ~2 o& A6 T E3 k1 v( \ <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">4 M+ y9 r+ N5 Z) L# q' g* I
<property name="dataSource" ref="dataSource"/>; y' S2 ]0 G; h2 G9 `( p! F
<property name="mappingResources">
% ]' J# B, a2 |# L6 n <list>
$ [1 r9 s* ]- T+ E+ E <value>com/ouou/model/Videos.hbm.xml</value> + `: Q- L% a: J- k
</list>4 f: p; O; B! k% x
</property>0 [+ l: S4 c6 Y7 e* x0 Y
<property name="hibernateProperties">2 r1 c: i- K( k) l; n- W
<props>% e7 ~2 F3 E1 l v$ `# x, v
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>7 S3 n* S, z2 m) H
<prop key="hibernate.current_session_context_class">thread</prop>3 y% E9 N- `+ q/ W$ t! n* \9 \0 y8 A
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
! j, g6 `. o$ C2 r <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop># ?: L* L! Y7 b4 P
<!--add ehcache-->
: |4 p0 E' W, D+ o! ^* F+ } <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
: _; L$ ~6 \# e8 R# v; ? <prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查询缓存 -->& ?' ?! |- s, \; j" S
<!--% y0 l1 d* q/ p5 s5 m4 G& l
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
' |8 M# M; u3 O* |9 a! O: a <prop key="hibernate.show_sql">true</prop>6 q3 y% x9 G2 U Z
-->4 }4 a- T7 \% l
<!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->) C7 Y; ?9 \$ ` l/ O. ^
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
6 X! \( T$ G& F+ t <!-- Create/update the database tables automatically when the JVM starts up
7 m3 g' e. b2 m9 K4 t( f5 D <prop key="hibernate.hbm2ddl.auto">update</prop> -->$ i: |( I+ a6 J+ p- k
<!-- Turn batching off for better error messages under PostgreSQL -->5 D6 H! g& B; i# e
<prop key="hibernate.jdbc.batch_size">25</prop>6 i6 Y6 A6 i1 Q9 p5 r2 q; W+ g7 T
<!--
; f) \+ E* `; S* B3 D" U- U <prop key="hibernate.connection.pool_size">10</prop>
+ v" F# u$ x3 _: E* | -->; k! C6 Q. X, q+ y @
</props>3 n4 w7 D9 N8 Y, W6 _
</property>
0 _0 x& [9 E; s! r0 d# L, |1 h </bean> 如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: 6 ]- L: U/ [% b$ O
<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 H2 Y- H7 j+ f0 R2 _" ]
its value in the running VM.2 r4 n# ]3 @0 }* G
The following properties are translated:
. j/ F8 ?- l9 X4 U user.home - User's home directory7 f3 L: {; t0 S7 P* G* @6 e: d
user.dir - User's current working directory% b& L$ [; G* l, e2 c: u2 @! q
java.io.tmpdir - Default temp file path -->
0 X+ D$ b* J6 @% q6 M' v <!--<diskStore path="java.io.tmpdir"/>-->; N, d- e4 P; c6 p
<diskStore path="/data/ehcache"/> <!--Default Cache configuration. These will applied to caches programmatically created through, q8 |' R* X! _
the CacheManager. The following attributes are required: maxElementsInMemory - Sets the maximum number of objects that will be created in memory' [6 A" C( _$ j; o
eternal - Sets whether elements are eternal. If eternal, timeouts are
' U0 Q) f% H2 O7 {3 E ignored and the element is never expired.7 D+ V* d' M9 @! y/ j
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache6 k- ^ H5 P- A @
has reached the maxInMemory limit. The following attributes are optional:
5 P. |. j( Y& ?6 T6 g timeToIdleSeconds - Sets the time to idle for an element before it expires.8 n2 o7 |) X& {; ?
i.e. The maximum amount of time between accesses before an
' q; I/ G/ K4 l6 h element expires Is only used if the element is not eternal.
' v, ~9 i# a; _# m1 Z( Y' { Optional attribute. A value of 0 means that an Element can idle+ A1 u& \9 F; P# s5 g$ S3 s
for infinity.The default value is 0.
* W( A/ ~5 M% }& I- N) x# d" M timeToLiveSeconds - Sets the time to live for an element before it expires.4 k- X% F2 k, m1 ?
i.e. The maximum time between creation time and when an element% P6 d5 s& q: f u5 f
expires. Is only used if the element is not eternal. r' C& S4 c7 D6 g) X# C2 Y
Optional attribute. A value of 0 means that and Element can live
) }1 b ]/ t% ?3 t( _- O& }7 A for infinity.0 V; g9 W, A9 g: `, K( O) U& k- Q
The default value is 0.
9 P, e& q* S r5 t0 z$ g diskPersistent - Whether the disk store persists between restarts of the Virtual
4 z/ Q' ]1 x2 W M `0 a$ t' K Machine.
* m% x$ a# d, X) L The default value is false.
3 j8 M( N* q, Z( J- H' q diskExpiryThreadIntervalSeconds - The number of seconds between runs of the disk expiry thread.4 l( W( P) Y. i
The default value is 120 seconds.# ^0 _, [) \3 d/ i0 [
--> <defaultCache. d/ u( T, P. E, m
maxElementsInMemory="10000"
$ `3 D" E( O/ i' A# ^ eternal="false"
0 o7 N4 M5 w( k* W0 F overflowToDisk="true"
& v6 z' B% V6 Y( o# M timeToIdleSeconds="120"
4 v6 ` C- a1 w; K# I# n timeToLiveSeconds="120"# ]/ p t6 B( o: i, ^
diskPersistent="false"
6 u# w& {# |# u. Q diskExpiryThreadIntervalSeconds="120"/>$ E5 G6 f- L$ x0 c" l
<cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000"" _9 a3 I: N' _- J5 G( Y
eternal="true" overflowToDisk="true"/>, c7 J' y3 X& K, a$ a" F& K2 r4 W
<cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"
& X' ]$ n5 Y9 h) Z- ~% r2 r timeToLiveSeconds="120" overflowToDisk="true"/>; V, v4 `, q1 L' r2 g
<cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=/ F9 ?" W0 i3 S) Q5 t7 o/ n6 t
"600" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>" ~6 j/ m5 ]8 U, t
<cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000"0 z6 @2 K3 Y- @( P, |8 {! b; P8 r
eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false"
8 r/ u Q3 R# J2 o diskPersistent="false"/>; ]# Z* o, m9 U5 ]) w7 B' Z- t
<cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600" U, P/ g( }- Z2 c) d
timeToLiveSeconds="600"
) D$ K, h% A$ p; Q: z y overflowToDisk="false" diskPersistent="false"/>. ~! y8 N6 y' {- l
<cache name="com.ouou.model.Videos" maxElementsInMemory="10000" eternal="false"
1 a2 ^% x5 \9 O overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>8 Z. x7 i/ {: u0 f# `' w) i" E) P
<cache name="com.ouou.model.Tags" maxElementsInMemory="10000" eternal="false"
7 B' O6 y Q4 \6 q1 R" |% J overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>: n* z7 o" A1 a* ^
</ehcache> 以com.ouou.model.Videos为例子' d2 ?2 V0 |6 _& p5 m5 ~% y7 I
在Videos.hbm.xml中配置:
7 t" I w1 j( u9 t( V& b! B<class name="Videos" table="TEST" lazy="false">* b; u$ P& R6 u) G, M. E K
<cache usage="read-write" region="ehcache.xml中的name的属性值"/>注意:这一句需要紧跟在class标签下面,其他位置无效。7 C- y1 R0 S. o: ^$ [
hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,
' X N7 ^9 D1 J7 x' H' [+ m如果不存在与类名匹配的cache名称,则用defaultCache。
+ O1 \* ~( c* L2 B" g* E! ?如果Videos包含set集合,则需要另行指定其cache
1 c' P( H0 m o$ c4 Q. L6 f" B例如Videos包含Tags集合,则需要8 ]# \& ?7 O8 |1 q3 F
添加如下配置到ehcache.xml中
% {& |! c# f+ f2 I! U3 H+ M<cache name="com.ouou.model.Tags"
( f' X- I, E$ U. ]" Z9 E maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"3 A2 }( y9 @7 } m
timeToLiveSeconds="120" overflowToDisk="false" />
5 H, `2 [* f' {% k另,针对查询缓存的配置如下:
3 n2 ~4 R' e/ B; ^$ R<cache name="org.hibernate.cache.UpdateTimestampsCache"1 `8 s/ h* V% N- D" H! k& M- i& H
maxElementsInMemory="5000"& g4 y w4 ^- {: a! S
eternal="true"& B4 F% X( M) w1 r
overflowToDisk="true"/>
4 U. c2 s6 h8 I<cache name="org.hibernate.cache.StandardQueryCache"( A' F/ Y) f5 X" ], C. _' |9 n) j
maxElementsInMemory="10000"
4 M# l/ r( l7 O4 x; m' [ X, v) T eternal="false"; }& e2 n7 f k% r0 F$ \
timeToLiveSeconds="120"4 ^% p! U) b) [! O. x0 g
overflowToDisk="true"/> 3、 选择缓存策略依据: <cache usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>' s; m8 i* B/ L6 ~1 s
ehcache不支持transactional,其他三种可以支持。' j V$ Z* U" Q; `# d: D; p
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,
9 d# I8 }6 Z* }! T" D% p9 r但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。7 |1 P/ }( Z6 S3 v& P" J+ W$ K8 j9 |
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level/ {) p8 P* p4 A% q3 s
(序列化事务隔离级别)
3 _2 c1 [6 ^# Q' ] Unonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,
- o: d% j# X0 C2 Q: \6 ~! F3 v' V那么比较适合使用非严格读/写缓存策略。 4、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。 5、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (
& ^ Y) Y) s1 Z' z. zorg.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。
/ j: w& j3 }7 f% B7 Z请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。
5 I4 W+ u: P& D2 n4 v需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。 8 w- }) \ S% ^ G" P9 z
Ehcache的配置说明
) D7 a1 F, W1 ~0 h- w* ?& C3 h<ehcache>* Q7 Z0 ~3 C6 \: ?+ O( @
<!--1 v& B8 H+ E g4 Z
磁盘存储配置:
) m! R' n+ W) M" T; Q$ G$ Y用来指定缓存在磁盘上的存储位置。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)+ a8 X, ]# `& _, L
-->( U/ H5 P9 b, h4 w
<diskStore path = "/var/apps/cache/" />
' o$ x3 I0 T& M% B) M* M<!--- {# l6 M1 |1 n: D% k
指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知! Q) _6 n: r+ B5 C" T
CacheManagerEventListenerFactory的属性
0 m* o6 S M# V S! e*class - CacheManagerEventListenerFactory的一个实现类
7 m! G2 E- T T( Q7 Y9 F! ?*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性
6 [& R7 s* M' c, N( J4 v3 }如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值
) D! e5 t1 i! G; n* Y5 K3 Z! j-->5 r/ O' F# p& Z: Z- x
<cacheManagerEventListenerFactory class="" properties="" /># e H" g; q) n, m) [ _
<!--1 r3 g! M* A* \! m8 i/ P
在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory,3 r- f5 \2 J1 U$ K
用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。
" i: L/ }' @+ ]( Z, \*class -CacheManagerPeerProviderFactory的一个实现类
! p' j l" i7 U/ K- P*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性
6 S8 A; {$ k/ x1 N5 eEhcache内建了2种基于RMI分布系统的通信策略:
! c2 F- G% R& o' x- Q& }*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应& R. _' q$ T' h$ P; k
*manual - 硬编码方式
目前的awf中不考虑分布缓存
/ k! q4 e& b) |--> H$ z! r o* s$ X. S
<cacheManagerPeerListenerFactory class="" properties="" />/ L' @4 }/ b" N* ~' A, s0 @/ S
<!--) L3 r; w1 G; }0 z# V
缓存配置。. t% ?* N4 T% ~8 D& U
以下属性是必须的:
+ G4 @" p& ?- ^" \, Nname - cache的标识符,在一个CacheManager中必须唯一
; Q* ?$ x% ]$ t7 H3 } WmaxElementsInMemory - 在内存中缓存的element的最大数目" u! \" p# j' a% y( M9 Z, Y) ?
maxElementsOnDisk - 在磁盘上缓存的element的最大数目
3 I5 @3 A' n& L0 i8 O4 h) R! peternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略" u, C1 \& V6 U; Y3 k
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
. d# @- H! E) @1 L! L a6 U- w% M以下属性是可选的:" k) Z( v* Y/ ?" w, U
timeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间.
1 [! S) L2 U4 I6 p M: O- s# u (如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)
: S4 W$ D/ X+ L( Y/ h$ ]8 i% `timeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期% w9 X" F+ d7 I' ^$ h: w
(是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)6 h" r, z/ q: {9 d$ g
diskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。
! u+ ^! c; \; G6 s# E! ^ (测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)
+ Z; Y0 |) d. k: k4 t& LdiskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒.
% V& b3 D6 z% e. Z8 |, ^ (测试一下0的时候会如何)
/ G5 h8 b' @$ @; t1 TmemoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,
# K3 J: R1 l' @5 A( U 移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO 可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些& T6 s9 Y, A4 N5 d# F' M
*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件
% p, E2 }- C! K" h6 O*bootstrapCacheLoaderFactory - 启动时加载缓存的element
4 P3 H6 U7 o& l+ c9 V每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。 W% f' N) f8 a9 d
Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory
; T; |: Y2 M) m1 S. b+ ~ <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
) y) P( q3 I) i- l' \ properties="replicateAsynchronouly=true,' O& r2 C" K' b& I Q4 u0 y3 s
replicatePuts=true,( m, p6 O6 J8 D8 s+ {
replicateUpdates=true,
' t# h; F- U' t$ ~6 I5 P! ~ replicateUpdateViaCopy=true,
" P+ b, T7 G. C# t P replicateRemovals=true" /> -->8 X9 w/ L |6 @/ _' x% H$ i4 A8 q' [
<cache .... />2 Y( v. r Z. e- h0 d6 I/ v" \& w
<!--
& c/ E- Z( Q' _+ g% |2 u默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存
+ u/ ~2 j3 y; M f* h: ]-->
/ f8 D$ G/ [; S: n<defaultCache maxElementsInMemory="10000" eternal="false"/ c# C; S j1 o' K
timeToIdleSeconds="120" timeToLiveSeconds="120"' j, z( l1 ] N* |: D
overflowToDisk="true" maxElementsOnDisk="1000000"
' {- s [! I& E, j) S diskPersistent="false" diskExpiryThreadIntervalSeconds="120", P* y/ b }3 Y+ \
memoryStoreEvictionPolicy="LRU"6 P1 @; M: \5 x$ S9 M, I" T
/> </ehcache> 0 i! Y: v4 g) v* l6 u' ]) l
|