1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?>' \7 o$ C; _. {# C0 r
<ehcache>
3 V' q# n6 V) ~7 b q <diskStore path="java.io.tmpdir"/>
/ r0 o5 F! v( k$ J <defaultCache
4 ^4 X+ {2 Y8 G% `, \# P8 U- { maxElementsInMemory="10000" <!-- 缓存最大数目 -->
5 R; A; Q8 O$ D ]1 {* h eternal="false" <!-- 缓存是否持久 --> overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
6 O7 |% x4 B' p. d timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->
! V+ h' F+ h1 S5 k# H5 Q9 T4 j diskPersistent="false"
" w& Z* s* f% x* h7 ]8 c diskExpiryThreadIntervalSeconds= "120"/>
2 A+ U C- e- ]5 I</ehcache> 2、在hibernate配置文件中设置: <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
* S, @# s5 @# @; o; j2 p7 \<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>( l. s8 M) ]# s% h
<!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>
, M& Q* n9 T9 h 如果使用spring调用Hibernate的sessionFactory的话,这样设置:9 x' ^- X& p2 U
<!--HibernateSession工厂管理 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">1 ~6 N* {" _, I: S) M y& ^
<property name="dataSource">
. A1 I+ g F5 \ <ref bean="datasource" />/ l$ M; l) R) ]# z, |
</property>+ ]! A( h( |) e/ x8 o9 I
<property name="hibernateProperties">8 \; F9 ?" n2 ~. R* r
<props>3 i4 {" J" m2 R: H4 A' }0 z1 R
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>+ ^0 _8 ^" s! z0 M! `# r" Q
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
" \& H& `/ S. a$ n2 P <prop key="hibernate.show_sql">true</prop>
2 p4 y) T" ]0 _5 P5 Z <prop key="hibernate.cache.use_query_cache">true</prop>
3 T+ s/ a7 b2 `2 P" d5 P. J+ C) z1 o <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>( M) @: O R/ `7 s W
</props>9 G# e' u$ t$ H
</property>' f# r: v$ B% e! C& M8 J7 R2 ]
<property name="mappingDirectoryLocations">
5 I0 K: {! |4 b& I. k3 O1 o. J: h3 s <list>
8 ?7 D" U% B4 d0 z/ J) n5 z) g <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>4 H! x+ J! X% E
</list>/ M+ J1 _$ B0 {6 g2 r
</property>$ a. F2 g* ^3 g6 N6 ?6 q% v
</bean> 说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 3、在Hbm文件中添加<cache usage="read-only"/> 1 s1 j, V4 I8 T7 n) m, F7 x% p& l
4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性 5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 package cn.rmic.hibernatesample; import java.util.List; import org.hibernate.CacheMode;
3 o' u$ i9 w/ [import org.hibernate.Criteria;+ u+ o6 y5 @' K
import org.hibernate.Query;
1 {6 T+ d. J1 U# d* {: J* v; V' `import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
7 C# r" g% u, g. @import cn.rmic.manager.po.Resources; public class testCacheSelectList ...{ public static void main(String[] args) ...{/ t4 F9 p2 D# A3 i. |
Session s=HibernateSessionFactory.getSession();
, x8 W4 B6 C6 T9 _9 ?9 B Criteria c=s.createCriteria(Resources.class);
/ s- V9 ]( B( Q/ q/ } c.setCacheable(true);9 L7 a7 [8 e$ a; z5 H4 R) J
List l=c.list(); Resources resources=(Resources)l.get(0);) W# O: D u% p. q% @
System.out.println("-1-"+resources.getName());8 G$ X: p) T" }: o5 O+ ^
HibernateSessionFactory.closeSession(); / m: }# |5 W" D2 `. Z/ v
try ...{
# C. q" k+ J3 r# M& Z# J/ j Thread.sleep(5000);
2 H1 [0 h1 R/ c, `% ` } catch (InterruptedException e) ...{
1 ?! X' q6 y2 I2 s2 \1 e7 W // TODO Auto-generated catch block
7 H4 T1 T0 p! s* j) k, n8 }# q! C+ n e.printStackTrace();
0 s" }+ p) u; S1 x$ Q( h }
* O* A. h8 @$ @" C$ o/ } s=HibernateSessionFactory.getSession();+ I% B$ B0 W! {0 g
c=s.createCriteria(Resources.class);, c: W% Z8 l# F* v2 T
c.setCacheable(true);5 p) A/ z9 W+ B! L4 n) Q, F
l=c.list();- K, a1 A+ H; _( V+ k8 X
resources=(Resources)l.get(0);
) y- S% U1 Y. {3 |! V* Q System.out.println("-2-"+resources.getName());2 s( |7 l0 U! `3 D
HibernateSessionFactory.closeSession();$ i: |& X' x, C( L
}
: t# `* A* b) Q& z6 o) q U Y a} " a$ M" V7 P, C7 e# u
1. 在Hibernate配置文件中设置:) u& `# c; s( `( c- O5 i% s
<!-- Hibernate SessionFactory -->/ G) i3 R2 T( b) @% m7 o3 S
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">) S4 S/ W1 E) B+ l$ j; C/ y8 I
<property name="dataSource" ref="dataSource"/>
; `6 G, |; K% F- {2 N% {8 \. [ <property name="mappingResources">7 ?. i+ V4 T* @: E
<list>
9 z# Q" N1 Q( T! A, W- L0 Q8 `$ r <value>com/ouou/model/Videos.hbm.xml</value>
+ c5 R0 n. X8 @9 E" w </list> \+ @8 [0 @; `# P
</property>
) @" v# O. h# x+ Z' N <property name="hibernateProperties">
- c& o1 K- D7 ~( P( x6 N <props>
0 X$ z( A% a2 g8 I N; J1 o <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>5 F5 V! o; m$ W- d
<prop key="hibernate.current_session_context_class">thread</prop>
/ G3 g5 C# ]& G5 ^: M9 x8 d <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>4 {0 K, i4 H$ G- w
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>/ Y; ?3 v, f: f& i: J
<!--add ehcache-->
1 |8 A! r) V2 n% \$ y <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>2 G2 e* _: L# A# X- D
<prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查询缓存 -->
. @# t B- @: |* n* d Z1 N d& w <!--: K* I* t5 W; t: \- P
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
# H! t5 l5 @4 n* ~, x <prop key="hibernate.show_sql">true</prop>
~. Z4 H1 z7 ~) @; E7 T -->$ {2 `5 J5 F& Z' ]
<!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->
o2 N. P4 i" X' U! M( @ <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
/ v) ~6 u0 m9 V) E <!-- Create/update the database tables automatically when the JVM starts up
. ^ w5 A T0 w$ Z) K" ~; f <prop key="hibernate.hbm2ddl.auto">update</prop> -->& D6 N! e3 {- d# @ P
<!-- Turn batching off for better error messages under PostgreSQL -->
4 d/ O. n0 K; ?* U <prop key="hibernate.jdbc.batch_size">25</prop>
: w- n( T0 i5 K" V/ v, ^ <!--: Z0 c: Q9 |3 u4 i X w2 x
<prop key="hibernate.connection.pool_size">10</prop>
+ {! T% t: H" b/ ]$ c -->2 O' |- ^3 y- f5 u0 g
</props>% N' N. J1 a4 Y9 e' [- P
</property>
" M) v% \+ c. J' v </bean> 如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行 2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: * m) y- E% F- A1 u( ]) n6 G
<ehcache> <!-- Sets the path to the directory where cache .data files are created. If the path is a Java System Property it is replaced by6 m5 |+ M: v0 T( ]
its value in the running VM.
" F& x% T4 Y( M: O9 R The following properties are translated:, e& B1 |" F' @4 B; f; I
user.home - User's home directory6 z4 z5 h q4 m; f: q
user.dir - User's current working directory
, A) G# h2 }2 @( ~/ B java.io.tmpdir - Default temp file path -->
% C3 W: F- _- U. p <!--<diskStore path="java.io.tmpdir"/>-->
+ g% x5 s, n# i6 u$ _1 E <diskStore path="/data/ehcache"/> <!--Default Cache configuration. These will applied to caches programmatically created through1 h! U& }& x3 w; F3 n
the CacheManager. The following attributes are required: maxElementsInMemory - Sets the maximum number of objects that will be created in memory7 M" w8 }! W, O M. @. E. w8 ~
eternal - Sets whether elements are eternal. If eternal, timeouts are0 v/ K# v# q' y" T9 _
ignored and the element is never expired.3 Z- J+ @/ ]% |9 V e
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache( w6 P. y2 ?) H, V8 M
has reached the maxInMemory limit. The following attributes are optional:% X5 k$ B+ E& @ ]. i
timeToIdleSeconds - Sets the time to idle for an element before it expires.$ m# g! Q, r3 Z6 B; i: o& V
i.e. The maximum amount of time between accesses before an" H# b2 M; g- v5 }* ?
element expires Is only used if the element is not eternal.
- @* M4 Z7 l u. F Optional attribute. A value of 0 means that an Element can idle
* T+ D5 e v3 S; ?4 S+ Y* L for infinity.The default value is 0.0 \8 Z4 `5 G5 x9 E. g
timeToLiveSeconds - Sets the time to live for an element before it expires.
, l) |/ H. f5 g$ N- p, I0 R i.e. The maximum time between creation time and when an element7 M. H* U. m' \
expires. Is only used if the element is not eternal.
" U0 u; ~5 K) Z, J' v" I# a1 ? Optional attribute. A value of 0 means that and Element can live' i. E( N9 t6 F- U2 j Q6 `
for infinity.
9 G. j" c0 H& J) ?* |: R The default value is 0.
0 W* z Z6 `9 D( m: T X. x diskPersistent - Whether the disk store persists between restarts of the Virtual p3 I& L2 G' ~$ U- }
Machine.
# S* i5 \5 ^# ^5 S @ The default value is false.
! J o3 J, W. N; e diskExpiryThreadIntervalSeconds - The number of seconds between runs of the disk expiry thread.! U5 B4 n: E; S3 R! F# K
The default value is 120 seconds.3 p- V1 I& y- B8 F z
--> <defaultCache
1 s' X. k5 _2 [5 G& C3 ] maxElementsInMemory="10000"
6 E7 W H+ o5 ^9 @ eternal="false"$ e& t( h8 D* y4 i
overflowToDisk="true"
* M& j2 W( d* m+ D! G timeToIdleSeconds="120"
# ~. n! n" Y! I6 c timeToLiveSeconds="120"
) d+ v+ V4 A. s! `5 b$ j diskPersistent="false"3 q& X, f( D2 ^& B$ X
diskExpiryThreadIntervalSeconds="120"/>& e. s. @9 b# R1 `* O8 q
<cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000"7 x# z! c. z6 H- Z4 P
eternal="true" overflowToDisk="true"/>
4 Y! }5 O" @3 U& H* [ <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"
" `- {) y2 B7 S4 m5 o; j* w timeToLiveSeconds="120" overflowToDisk="true"/>6 t% r$ F {1 ]" |7 f# ^
<cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=" q+ j- q% @/ S6 h
"600" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>
+ P9 p6 H' g5 T; t, o' f6 u( M <cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000"+ |5 i5 p6 P2 e# n* A, c) v
eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false"
9 k1 |: R- M4 i( ~) S diskPersistent="false"/>% k U) k1 @ b3 R
<cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600"4 W2 G$ n% I3 K D4 ~0 ^
timeToLiveSeconds="600"& g1 y+ z4 q8 D- Y
overflowToDisk="false" diskPersistent="false"/>. u8 \* ^# r/ G. Y" h8 y
<cache name="com.ouou.model.Videos" maxElementsInMemory="10000" eternal="false"
: T: v( j4 X% ~- v) k6 S7 r$ Y overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>
8 T7 @' ^* b) Z <cache name="com.ouou.model.Tags" maxElementsInMemory="10000" eternal="false"; N( K$ F! i$ Q% M- }; B3 A! G
overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>
y" A! }6 J& P! g! l</ehcache> 以com.ouou.model.Videos为例子
5 n0 j+ S0 P d! K1 n# g在Videos.hbm.xml中配置:
d# V% d0 e/ @ t- S<class name="Videos" table="TEST" lazy="false">
+ a) K0 M7 ^- k" g <cache usage="read-write" region="ehcache.xml中的name的属性值"/>注意:这一句需要紧跟在class标签下面,其他位置无效。
9 b( d$ x8 k; Z' N% T4 I! Lhbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,
! |: p* ^( P. ~8 m0 X) q4 ]如果不存在与类名匹配的cache名称,则用defaultCache。- v! g& Y; K9 {) V
如果Videos包含set集合,则需要另行指定其cache
]6 e9 U6 j! ^2 a- C; t! E; q例如Videos包含Tags集合,则需要2 ?: H2 P$ J. }
添加如下配置到ehcache.xml中
" d. R" r+ f3 X7 @# q$ ?8 a<cache name="com.ouou.model.Tags"9 i6 Z4 V1 ^/ E; ^
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"4 n0 {' |0 _3 Z/ p W4 S: ?
timeToLiveSeconds="120" overflowToDisk="false" />
. y. c" P. K4 B% Q另,针对查询缓存的配置如下:
1 f4 B. }8 Q" ^0 V$ i8 _9 b<cache name="org.hibernate.cache.UpdateTimestampsCache"
# J' a# W- q8 h( ? maxElementsInMemory="5000") I% f4 A; L% c# s. n7 j
eternal="true"; z- {6 [) O' X1 i0 d( b- d6 n
overflowToDisk="true"/> B( u4 e5 q u, E6 v& I
<cache name="org.hibernate.cache.StandardQueryCache"
9 T3 V6 s6 b& t: b5 A maxElementsInMemory="10000"7 ^. k2 M ?/ w* {- C
eternal="false"( J1 U& ?8 p/ |1 n9 [6 [/ g
timeToLiveSeconds="120"
, L; z8 T3 h1 X5 C overflowToDisk="true"/> 3、 选择缓存策略依据: <cache usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>
3 g3 Z0 ?5 M+ J4 `! M/ @: Iehcache不支持transactional,其他三种可以支持。: m' ?/ C) V% _. w
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,7 N5 g: E2 g2 s& O$ R3 O$ D
但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
; [0 z& c1 {, j+ eread-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level
8 V7 r0 C6 [1 _" U0 O( S(序列化事务隔离级别)
/ S% g1 s: R8 O: @2 A( R: |) Rnonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,
K$ d6 r* Y- i5 N那么比较适合使用非严格读/写缓存策略。 4、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。 5、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (
, B+ ^6 P2 T5 _org.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。 R5 v2 D Z+ ^+ M
请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。/ U! b" G1 R1 B2 [1 ?7 ~* L
需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。 # \1 d# T& e7 u9 Q6 y
Ehcache的配置说明 9 i c& l( X. R; k! R9 p. f* B& O
<ehcache>
, M! U- L3 v3 L& s/ d. W8 c<!--; E) g1 M; u- H3 a7 I, S+ X/ e" j: e
磁盘存储配置:% @! V y$ d; F* ^
用来指定缓存在磁盘上的存储位置。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)3 T) Z& b% \! E" S$ g" @
-->4 E. H" }1 I4 A% v, Y
<diskStore path = "/var/apps/cache/" />% @$ b: E6 j- G* d1 b, ^$ P
<!--
) W- U7 t- q* T" M3 q8 `' e$ X! T指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知
8 A# d! G$ Y$ r& GCacheManagerEventListenerFactory的属性+ a8 _( G+ U x1 z& X
*class - CacheManagerEventListenerFactory的一个实现类, S! K% ?! a$ p6 j9 e
*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性
8 u+ p( ^2 d+ B% }2 {如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值) r* V' w& a8 |) j1 l& e9 U
-->* I8 E7 [7 ^0 l. Z3 f! n' Z3 t
<cacheManagerEventListenerFactory class="" properties="" />) l; f& n! \* l' i% _, I% f
<!--
. h4 q$ I5 r% d5 }' P* S0 C2 P在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory,
1 _* A, J) l. N8 M" b用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。
& T/ X4 \& `/ B2 ~# K3 ]+ {*class -CacheManagerPeerProviderFactory的一个实现类; Y( k; M+ J3 d9 s- I# w- k( Q
*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性
) u( }* b" E2 tEhcache内建了2种基于RMI分布系统的通信策略:5 i8 C4 G% L% V9 A
*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应
: x) z' [& [- z, m*manual - 硬编码方式 目前的awf中不考虑分布缓存$ F* F {% p2 K$ y7 v
-->
: |- N/ }# {& s! a- `<cacheManagerPeerListenerFactory class="" properties="" />
' J R: p0 y4 y( O' @<!--4 n% e! U y1 p6 e4 m# i
缓存配置。
+ Z8 x7 e- c& y5 O0 b以下属性是必须的:
/ p# a- p: m( D B: C9 t# Cname - cache的标识符,在一个CacheManager中必须唯一7 e0 S1 E" m% m G
maxElementsInMemory - 在内存中缓存的element的最大数目
% x; t3 Z! N1 y g! b" PmaxElementsOnDisk - 在磁盘上缓存的element的最大数目
# j5 p& G3 s, K" B" C4 }: Teternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略
( K! Y- U9 B. q2 WoverflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
# d' a+ ]* M1 M, o. J" ~$ C' S5 E以下属性是可选的:# p$ H# ]8 z" z7 t( H
timeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间.# _6 n. W" I4 V2 u7 u" l
(如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)1 \# K7 l- p2 [$ N) B8 Z
timeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期
; R8 D7 b' Q# j/ f- T. K% t (是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)5 w3 t+ g: L3 L3 N' z( \ K1 Q7 W
diskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。
7 y! z0 W8 n% _8 R0 y (测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)
- ?1 O' O5 f) n3 {2 x. p* }5 p, \- d, idiskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒.
, E( U# k5 J) n. Y: u$ `5 c0 y: ` (测试一下0的时候会如何)
6 t1 G7 B' U4 s5 H2 a H! vmemoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,( p2 o: r2 q9 H! i% \
移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO 可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些
; X: V) p+ T9 {2 P* @; T2 \*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件# ` h; _' e0 I
*bootstrapCacheLoaderFactory - 启动时加载缓存的element9 Q1 i, d, D; R& W6 b; |% A6 X% z; F5 o
每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。( D& t8 B5 V& l/ l
Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory
1 C- l U h; o+ J: }/ }! P <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
# y6 J: I3 ?' r$ `5 w% l properties="replicateAsynchronouly=true,
4 g/ p3 y7 h# [4 ?$ } replicatePuts=true,7 M) K) X1 |4 X% T0 z+ r7 n' U" V& w
replicateUpdates=true,5 R) y0 r) @/ S5 a
replicateUpdateViaCopy=true,
3 G! L, B% @9 M0 F, G7 u; I replicateRemovals=true" /> -->! _, m( k4 Q2 t) y1 b* a* T; `
<cache .... />
4 k( [8 x; h, J& D1 y<!--
% |5 B) V5 x6 @6 N# L默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存
- Q0 z: b0 o( r$ T-->) r7 k0 T. O- f3 ]# y9 L5 H
<defaultCache maxElementsInMemory="10000" eternal="false"
5 S/ c Z( M- v, U2 \ timeToIdleSeconds="120" timeToLiveSeconds="120"
`# d; \5 K5 E/ r, n overflowToDisk="true" maxElementsOnDisk="1000000"
! r, r+ y/ A. d! k diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/ M% \3 r O( V+ I
memoryStoreEvictionPolicy="LRU"' t, a' D' N# G; W8 T# d
/> </ehcache>
+ u) c: P' e2 @" U0 J |