??xml version="1.0" encoding="utf-8" standalone="yes"?>另类av一区二区,亚洲国产成人精品视频,五月天亚洲一区http://www.aygfsteel.com/stevenjohn/category/51693.html那些青春的岁?/description>zh-cnMon, 14 May 2012 01:29:17 GMTMon, 14 May 2012 01:29:17 GMT60Hibernate Annotation 中配|EhCache~存 http://www.aygfsteel.com/stevenjohn/archive/2012/05/14/378069.htmlabinabinMon, 14 May 2012 01:24:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/05/14/378069.htmlhttp://www.aygfsteel.com/stevenjohn/comments/378069.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/05/14/378069.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/378069.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/378069.htmlCache介: ~存(Cache )是计机领域非常通用的概c它介于应用E序和永久性数据存储源(如硬盘上的文件或者数据库)之间Q其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的q行性能。缓存中的数据是数据存储源中数据的拷贝,应用E序在运行时直接d~存中的数据Q只在某些特定时L照缓存中的数据来同步更新数据存储源?br />~存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或盘Q应用程序读写内在的速度昄比读写硬盘的速度快,如果~存中存攄数据量非常大Q也会用盘作ؓ~存的物理介质?br />~存的实C仅需要作为物理介质的gQ同时还需要用于管理缓存的q发讉K和过期等{略的Y件。因此,~存是通过软g和硬件共同实现的?br />1.1.    持久化层的缓存的范围
~存的范围决定了~存的生命周期以及可以被谁访问。缓存的范围分ؓ三类?br />1) 事务范围Q缓存只能被当前事务讉K。缓存的生命周期依赖于事务的生命周期Q当事务l束Ӟ~存也就l束生命周期。在此范围下Q缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,~存内的数据通常采用怺兌的对象Ş式?br />2) q程范围Q缓存被q程内的所有事务共享。这些事务有可能是ƈ发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进E的生命周期Q进E结束时Q缓存也q束了生命周期。进E范围的~存可能会存攑֤量的数据Q所以存攄介质可以是内存或盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据Ş式。松散的对象数据形式有点cM于对象的序列化数据,但是对象分解为松散的法比对象序列化的算法要求更快?br />3) 集群范围Q在集群环境中,~存被一个机器或者多个机器的q程׃n。缓存中的数据被复制到集环境中的每个进E节点,q程间通过q程通信来保证缓存中的数据的一致性,~存中的数据通常采用对象的松散数据Ş式?br />对大多数应用来说Q应该慎重地考虑是否需要用集范围的~存Q因问的速度不一定会比直接访问数据库数据的速度快多?br />持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,q可以到q程范围或集范围的~存内查询,如果q是没有查到Q那么只有到数据库中查询。事务范围的~存是持久化层的W一U缓存,通常它是必需的;q程范围或集范围的~存是持久化层的W二U缓存,通常是可选的?/strong>
1.2.    持久化层的缓存的q发讉K{略
当多个ƈ发的事务同时讉K持久化层的缓存的相同数据Ӟ会引起ƈ发问题,必须采用必要的事务隔L施?br />在进E范围或集群范围的缓存,即第二~存Q会出现q发问题。因此可以设定以下四U类型的q发讉K{略Q每一U策略对应一U事务隔ȝ别?br />1) 事务?Transactional){略Q仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离U别。对于经常被M很少修改的数据,可以采用q种隔离cdQ因为它可以防止脏读和不可重复读q类的ƈ发问题?br />2) d?read-write){略Q提供了Read Committed事务隔离U别。仅仅在非集的环境中适用。对于经常被M很少修改的数据,可以采用q种隔离cdQ因为它可以防止脏读q类的ƈ发问题?br />3) 非严D写型(nonstrict-read-write){略Q不保证~存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能,必须数据配置一个很短的数据q期旉Q从而尽量避免脏诅R对于极被修改Qƈ且允许偶脏ȝ数据Q可以采用这Uƈ发访问策略?br />4) 只读型策?read-only)Q对于从来不会修改的数据Q如参考数据,可以使用q种q发讉K{略?br />事务型ƈ发访问策略是事务隔离U别最高,只读型的隔离U别最低。事务隔ȝ别越高,q发性能p低?br />2.    Hibernate中的~存Q?/font>
Hibernate中提供了两CacheQ第一U别的缓存是SessionU别的缓存,它是属于事务范围的缓存。这一U别的缓存由hibernate理的,一般情况下无需q行q预Q第二别的~存是SessionFactoryU别的缓存,它是属于q程范围或群集范围的~存。这一U别的缓存可以进行配|和更改Qƈ且可以动态加载和卸蝲?br />Hibernateqؓ查询l果提供了一个查询缓存,它依赖于W二U缓存?br />2.1.    一U缓存和二~存的比较:

W一U缓?/strong>
W二U缓?/strong>
存放数据的Ş?/strong>
怺兌的持久化对象
对象的散装数?br />~存的范?/strong>
事务范围Q每个事务都有单独的W一U缓?br />q程范围或集范_~存被同一个进E或集群范围内的所有事务共?br />q发讉K{略
׃每个事务都拥有单独的W一U缓存,不会出现q发问题Q无需提供q发讉K{略
׃多个事务会同时访问第二~存中相同数据,因此必须提供适当的ƈ发访问策略,来保证特定的事务隔离U别
数据q期{略
没有提供数据q期{略。处于一U缓存中的对象永q不会过期,除非应用E序昑ּ清空~存或者清除特定的对象
必须提供数据q期{略Q如Z内存的缓存中的对象的最大数目,允许对象处于~存中的最长时_以及允许对象处于~存中的最长空闲时?br />物理存储介质
内存
内存和硬盘。对象的散装数据首先存放在基于内在的~存中,当内存中对象的数目达到数据过期策略中指定上限Ӟ׃把其余的对象写入Z盘的缓存中?br />~存的Y件实?/strong>
在Hibernate的Session的实C包含了缓存的实现
q三方提供QHibernate仅提供了~存适配?CacheProvider)。用于把特定的缓存插仉成到Hibernate中?br />启用~存的方?/strong>
只要应用E序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作QHibernate׃启用W一U缓存,把数据库中的数据以对象的形式拯到缓存中Q对于批量更新和扚w删除操作Q如果不希望启用W一U缓存,可以l过Hibernate APIQ直接通过JDBC API来执行指操作?br />用户可以在单个类或类的单个集合的_度上配|第二~存。如果类的实例被l常M很少被修改,可以考虑使用W二U缓存。只有ؓ某个cL集合配置了第二~存QHibernate在运行时才会把它的实例加入到W二U缓存中?br />用户理~存的方?/strong>
W一U缓存的物理介质为内存,׃内存定w有限Q必通过恰当的检索策略和索方式来限制加蝲对象的数目。Session的evit()Ҏ可以昑ּ清空~存中特定对象,但这U方法不值得推荐?br />W二U缓存的物理介质可以是内存和盘Q因此第二~存可以存放大量的数据,数据q期{略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二~存主要包括两个斚wQ选择需要用第二~存的持久类Q设|合适的q发讉K{略Q选择~存适配器,讄合适的数据q期{略?br />2.2.    一U缓存的理Q?/strong>
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load()Q以及调用查询接口的list()、iterate()或filter()ҎӞ如果在Session~存中还不存在相应的对象QHibernate׃把该对象加入到第一U缓存中。当清理~存ӞHibernate会根据缓存中对象的状态变化来同步更新数据库?br />Session为应用程序提供了两个理~存的方法:
evict(Object obj)Q从~存中清除参数指定的持久化对象?br />clear()Q清I缓存中所有持久化对象?br />2.3.    ~存的管理:
2.3.1.      Hibernate的二U缓存策略的一般过E如下:
1) 条g查询的时候,L发出一条select * from table_name where …. Q选择所有字D)q样的SQL语句查询数据库,一ơ获得所有的数据对象?nbsp;
2) 把获得的所有数据对象根据ID攑օ到第二~存中?nbsp;
3) 当HibernateҎID讉K数据对象的时候,首先从Session一U缓存中查;查不刎ͼ如果配置了二U缓存,那么从二U缓存中查;查不刎ͼ再查询数据库Q把l果按照ID攑օ到缓存?nbsp;
4) 删除、更新、增加数据的时候,同时更新~存?br />  Hibernate的二U缓存策略,是针对于ID查询的缓存策略,对于条g查询则毫无作用。ؓ此,Hibernate提供了针Ҏ件查询的Query Cache?br />2.3.2.      什么样的数据适合存放到第二~存中?
1 很少被修改的数据
2 不是很重要的数据Q允许出现偶ƈ发的数据
3 不会被ƈ发访问的数据
4 参考数?指的是供应用参考的帔R数据Q它的实例数目有限,它的实例会被许多其他cȝ实例引用Q实例极或者从来不会被修改?br />2.3.3.      不适合存放到第二~存的数据?
1 l常被修改的数据
2 财务数据Q绝对不允许出现q发
3 与其他应用共享的数据?br />2.3.4.      常用的缓存插?/strong>
Hibernater 的二U缓存是一个插Ӟ下面是几U常用的~存插gQ?br />l EhCacheQ可作ؓq程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持?br />l OSCacheQ可作ؓq程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的~存数据q期{略Q对Hibernate的查询缓存提供了支持?br />l SwarmCacheQ可作ؓ集范围内的~存Q但不支持Hibernate的查询缓存?br />l JBossCacheQ可作ؓ集范围内的~存Q支持事务型q发讉K{略Q对Hibernate的查询缓存提供了支持?br />2.3.5.      配置二~存的主要步骤:
1)      选择需要用二U缓存的持久化类Q设|它的命名缓存的q发讉K{略。这是最值得认真考虑的步骤?br />2)      选择合适的~存插gQ然后编辑该插g的配|文件?br /> 
 
1.  首先讄EhCacheQ徏立配|文件ehcache.xmlQ默认的位置在class-pathQ可以放C的src目录下:
<ehcache>
    <diskStore path="c:\\ehcache\"/> 
    <defaultCache 
        maxElementsInMemory="10000" 
        eternal="false" 
        timeToIdleSeconds="120" 
        timeToLiveSeconds="120" 
        overflowToDisk="true"   
        />
        
    <!-- 讄Categorycȝ~存的数据过期策?nbsp;-->
    <cache name="org.qiujy.domain.cachedemo.Category"
        maxElementsInMemory="100"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        />
        
     <!-- 讄Categorycȝproducts集合的缓存的数据q期{略 -->
     <cache name="org.qiujy.domain.cachedemo.Category.products"
        maxElementsInMemory="500"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
        
    <cache name="org.qiujy.domain.cachedemo.Product"
        maxElementsInMemory="500"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />    
</ehcache>
配置的元素说明:
元素或属?/strong>
描述
<diskStore>
讄~存数据文g的存攄?br /><defaultCache>
讄~存的默认数据过期策?br /><cache>
讑֮具体的命名缓存的数据q期{略
每个命名~存代表一个缓存区域,每个~存区域有各自的数据q期{略。命名缓存机制得用戯够在每个cM及类的每
  2.  在Hibernate配置文g中设|:

<hibernate-configuration>
<session-factory>……<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><property name="cache.use_second_level_cache">true</property>……</session-factory></hibernate-configuration>        此外Q可以把cache.use_second_level_cache讄为false关闭所有的hibernate二~存。但此属性对指定<cache>的类~省为true?font style="line-height: 1.3em" size="1">
 
   3.  Z使用二~存Q需要在每一个Hibernate Entity上配|?br />@Entity   
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)    
public class Forest { ... }   
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)    
@JoinColumn(name="CUST_ID")    
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)    
public SortedSet getTickets() {    
    return tickets;    
}   
@Cache(    
    CacheConcurrencyStrategy usage();                 (1)    
    String region() default "";                       (2)    
    String include() default "all";                   (3)    
)   
(1) usage: 提供~存对象的事务隔LӞ可选值有以下几种
(NONE, READ_ONLY, NONSTRICT_READ_WRITE(非严D?, READ_WRITE, TRANSACTIONAL)
(2) region (optional): 指定~存的区域,默认是类的全限定名。利用缓存区域,可以更精的指定每个区域的缓存超前策略。如果指定了~存区域前缀Q在hibernate.cfg.xml中设|cache.region_prefix属性ؓ一个字W串Q,则所有的~存区域名前加上这个前~?br />(3) include (optional): all to include all properties, non-lazy to only include non lazy properties (default all).
如果不是使用annotation的话Q则是在Hbm文g中添加cache usage="read-only"



http://blog.163.com/seara520@126/blog/static/7206930420102232340810/

abin 2012-05-14 09:24 发表评论
]]>
վ֩ģ壺 ɽ| | Ǽ| | ͤ| Ӧ| ͨ| ʯ| | ѽ| | | | | ˮ| ̩| | ˮ| ͬ| | | ͼ| ػʵ| | | | | | | | ̩| | ڳ| | ͤ| ƽ| Դ| | ľ| | |