﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java神谕-随笔分类-Hibernate</title><link>http://www.blogjava.net/javaora/category/1810.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:23:23 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:23:23 GMT</pubDate><ttl>60</ttl><item><title>Hibernate的缓存处理</title><link>http://www.blogjava.net/javaora/archive/2005/06/22/6556.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Wed, 22 Jun 2005 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/06/22/6556.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/6556.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/06/22/6556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/6556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/6556.html</trackback:ping><description><![CDATA[<DIV class=sect2 lang=zh-cn>
<DIV class=titlepage>
<DIV>
<DIV>
<H3 class=title><A name=performance-cache-mapping></A>20.2.1.&nbsp;缓存映射（Cache mappings） </H3></DIV></DIV>
<DIV></DIV></DIV>
<P>类或者集合映射的“<TT class=literal>&lt;cache&gt;</TT>元素”可以有下列形式： </P>
<DIV class=programlistingco><PRE class=programlisting>&lt;cache 
    usage="transactional|read-write|nonstrict-read-write|read-only"  <SPAN class=co>(1)</SPAN>
/&gt;</PRE>
<DIV class=calloutlist>
<TABLE summary="Callout list" border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width="5%">(1)</TD>
<TD vAlign=top align=left>
<P><TT class=literal>usage</TT>说明了缓存的策略: <TT class=literal>transactional</TT>、 <TT class=literal>read-write</TT>、 <TT class=literal>nonstrict-read-write</TT>或 <TT class=literal>read-only</TT>。 </P></TD></TR></TBODY></TABLE></DIV></DIV>
<P>另外(首选?), 你可以在hibernate.cfg.xml中指定<TT class=literal>&lt;class-cache&gt;</TT>和 <TT class=literal>&lt;collection-cache&gt;</TT> 元素。 </P>
<P>这里的<TT class=literal>usage</TT> 属性指明了<SPAN class=emphasis><EM>缓存并发策略（cache concurrency strategy）</EM></SPAN>。 </P></DIV>
<DIV class=sect2 lang=zh-cn>
<DIV class=titlepage>
<DIV>
<DIV>
<H3 class=title><A name=performance-cache-readonly></A>20.2.2.&nbsp;策略：只读缓存（Strategy: read only） </H3></DIV></DIV>
<DIV></DIV></DIV>
<P>如果你的应用程序只需读取一个持久化类的实例，而无需对其修改， 那么就可以对其进行<TT class=literal>只读</TT> 缓存。这是最简单，也是实用性最好的方法。甚至在集群中，它也能完美地运作。 </P><PRE class=programlisting>&lt;class name="eg.Immutable" mutable="false"&gt;
    &lt;cache usage="read-only"/&gt;
    ....
&lt;/class&gt;</PRE></DIV>
<DIV class=sect2 lang=zh-cn>
<DIV class=titlepage>
<DIV>
<DIV>
<H3 class=title><A name=performance-cache-readwrite></A>20.2.3.&nbsp; 策略:读/写缓存（Strategy: read/write） </H3></DIV></DIV>
<DIV></DIV></DIV>
<P>如果应用程序需要更新数据，那么使用<TT class=literal>读/写缓存</TT> 比较合适。 如果应用程序要求“序列化事务”的隔离级别（serializable transaction isolation level），那么就决不能使用这种缓存策略。 如果在JTA环境中使用缓存，你必须指定<TT class=literal>hibernate.transaction.manager_lookup_class</TT>属性的值， 通过它，Hibernate才能知道该应用程序中JTA的<TT class=literal>TransactionManager</TT>的具体策略。 在其它环境中，你必须保证在<TT class=literal>Session.close()</TT>、或<TT class=literal>Session.disconnect()</TT>调用前， 整个事务已经结束。 如果你想在集群环境中使用此策略，你必须保证底层的缓存实现支持锁定(locking)。Hibernate内置的缓存策略并不支持锁定功能。 </P><PRE class=programlisting>&lt;class name="eg.Cat" .... &gt;
    &lt;cache usage="read-write"/&gt;
    ....
    &lt;set name="kittens" ... &gt;
        &lt;cache usage="read-write"/&gt;
        ....
    &lt;/set&gt;
&lt;/class&gt;</PRE></DIV>
<DIV class=sect2 lang=zh-cn>
<DIV class=titlepage>
<DIV>
<DIV>
<H3 class=title><A name=performance-cache-nonstrict></A>20.2.4.&nbsp; 策略:非严格读/写缓存（Strategy: nonstrict read/write） </H3></DIV></DIV>
<DIV></DIV></DIV>
<P>如果应用程序只偶尔需要更新数据（也就是说，两个事务同时更新同一记录的情况很不常见），也不需要十分严格的事务隔离， 那么比较适合使用<TT class=literal>非严格读/写缓存</TT>策略。如果在JTA环境中使用该策略， 你必须为其指定<TT class=literal>hibernate.transaction.manager_lookup_class</TT>属性的值， 在其它环境中，你必须保证在<TT class=literal>Session.close()</TT>、或<TT class=literal>Session.disconnect()</TT>调用前， 整个事务已经结束<BR><BR>-------------------------------------------------------------------------<BR>在jBPM 中使用不少这样的非严格读/写缓存的处理：<BR>&lt;?xml version="1.0"?&gt;</P>
<P>&lt;!DOCTYPE hibernate-mapping PUBLIC<BR>&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <BR>&nbsp;&nbsp;&nbsp; "<A href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</A>"&gt;</P>
<P>&lt;hibernate-mapping default-access="field"&gt;</P>
<P>&nbsp; &lt;class name="org.jbpm.context.def.VariableAccess" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table="JBPM_VARIABLEACCESS"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazy="false"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;cache usage="nonstrict-read-write"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;id name="id" column="ID_"&gt;&lt;generator class="native" /&gt;&lt;/id&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;property name="variableName" column="VARIABLENAME_" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="access" column="ACCESS_" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="mappedName" column="MAPPEDNAME_" /&gt;<BR>&nbsp; &lt;/class&gt;</P>
<P>&lt;/hibernate-mapping&gt;<BR><BR>它的ehcache.xml 是这样配置的：<BR>&lt;ehcache&gt;<BR>&nbsp;&lt;defaultCache<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="100000"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="true"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="false"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskPersistent="false"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<BR>&lt;/ehcache&gt;</P></DIV><img src ="http://www.blogjava.net/javaora/aggbug/6556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-06-22 17:32 <a href="http://www.blogjava.net/javaora/archive/2005/06/22/6556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>