📄 performance.html
字号:
<tt class="literal">read-write</tt>, <tt class="literal">nonstrict-read-write</tt> 或者 <tt class="literal">read-only</tt> </p></td></tr></table></div></div><p> 另外 (推荐首选?), 你可以在<tt class="literal">hibernate.cfg.xml</tt>中指定<tt class="literal"><class-cache></tt> 和 <tt class="literal"><collection-cache></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>14.3.2. 策略:只读缓存</h3></div></div><div></div></div><p> 如果你的应用程序需要读取一个持久化类的实例,但是并不打算修改它们,可以使用<tt class="literal">read-only</tt> 缓存。这是最简单,也是实用性最好的策略。甚至在集群中,它也能完美地运作。 </p><pre class="programlisting"><class name="eg.Immutable" mutable="false"> <cache usage="read-only"/> ....</class></pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="performance-cache-readwrite"></a>14.3.3. 策略:读/写缓存</h3></div></div><div></div></div><p> 如果应用程序需要更新数据,可能<tt class="literal">read-write</tt>缓存比较合适。如果需要可序列化事务隔离级别(serializable transaction isolation level),这种缓存决不能使用。如果在JTA环境中使用这种缓存,你必须指定<tt class="literal">hibernate.transaction.manager_lookup_class</tt>属性的值,给出得到JTA <tt class="literal">TransactionManager</tt>的策略。在其它环境中,你必须确保在<tt class="literal">Session.close()</tt>或者<tt class="literal">Session.disconnect()</tt>调用前,事务已经结束了。 如果你要在集群环境下使用这一策略,你必须确保底层的缓存实现支持锁定(locking)。内置的缓存提供器<span class="emphasis"><em>并不</em></span>支持。 </p><pre class="programlisting"><class name="eg.Cat" .... > <cache usage="read-write"/> .... <set name="kittens" ... > <cache usage="read-write"/> .... </set></class></pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="performance-cache-nonstrict"></a>14.3.4. 策略:不严格的读/写缓存</h3></div></div><div></div></div><p> 如果程序偶尔需要更新数据(也就是说,出现两个事务同时更新同一个条目的现象很不常见),也不需要十分严格的事务隔离,可能适用<tt class="literal">nonstrict-read-write</tt>缓存。如果在JTA环境中使用这种缓存,你必须指定<tt class="literal">hibernate.transaction.manager_lookup_class</tt>属性的值,给出得到JTA <tt class="literal">TransactionManager</tt>的策略。在其它环境中,你必须确保在<tt class="literal">Session.close()</tt>或者<tt class="literal">Session.disconnect()</tt>调用前,事务已经结束了。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="performance-cache-transactional"></a>14.3.5. 策略:事务缓存(transactional)</h3></div></div><div></div></div><p> <tt class="literal">transactional</tt>缓存策略提供了对全事务缓存提供,比如JBoss TreeCache的支持。这样的缓存只能用于JTA环境,你必须指定<tt class="literal">hibernate.transaction.manager_lookup_class</tt>。 </p></div><p> 没有一种缓存提供器能够支持所有的缓存并发策略。下面的表列出每种提供器与各种并发策略的兼容性。 </p><div class="table"><a name="d0e8845"></a><p class="title"><b>表 14.2. 缓存并发策略支持(Cache Concurrency Strategy Support)</b></p><table summary="缓存并发策略支持(Cache Concurrency Strategy Support)" border="1"><colgroup><col align="left"><col align="left"><col align="left"><col align="left"><col align="left"></colgroup><thead><tr><th align="left">Cache</th><th align="left">read-only</th><th align="left">nonstrict-read-write</th><th align="left">read-write</th><th align="left">transactional</th></tr></thead><tbody><tr><td align="left">Hashtable (not intended for production use)</td><td align="left">yes</td><td align="left">yes</td><td align="left">yes</td><td align="left"> </td></tr><tr><td align="left">EHCache</td><td align="left">yes</td><td align="left">yes</td><td align="left">yes</td><td align="left"> </td></tr><tr><td align="left">OSCache</td><td align="left">yes</td><td align="left">yes</td><td align="left">yes</td><td align="left"> </td></tr><tr><td align="left">SwarmCache</td><td align="left">yes</td><td align="left">yes</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">JBoss TreeCache</td><td align="left">yes</td><td align="left"> </td><td align="left"> </td><td align="left">yes</td></tr></tbody></table></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="performance-sessioncache"></a>14.4. 管理Session缓存</h2></div></div><div></div></div><p> 不管何时你传递一个对象给<tt class="literal">save()</tt>, <tt class="literal">update()</tt>或者 <tt class="literal">saveOrUpdate()</tt> ,或者不管何时你使用<tt class="literal">load()</tt>, <tt class="literal">find()</tt>, <tt class="literal">iterate()</tt>或者<tt class="literal">filter()</tt>取得一个对象的时候,该对象被加入到<tt class="literal">Session</tt>的内部缓存中。当后继的<tt class="literal">flush()</tt>被调用时,对象的状态会和数据库进行同步。如果你在处理大量对象并且需要有效的管理内存的时候,你可能不希望发生这种同步,<tt class="literal">evict()</tt>方法可以从缓存中去掉对象和它的集合。 </p><pre class="programlisting">Iterator cats = sess.iterate("from eg.Cat as cat"); //a huge result setwhile ( cats.hasNext() ) { Cat cat = (Cat) iter.next(); doSomethingWithACat(cat); sess.evict(cat);}</pre><p> Hibernate will evict associated entities automatically if the association is mapped with <tt class="literal">cascade="all"</tt> or <tt class="literal">cascade="all-delete-orphan"</tt>. 如果关联通过<tt class="literal">cascade="all"</tt> 或者 <tt class="literal">cascade="all-delete-orphan"</tt>实现,Hibernate会自动删除关联的实体。 </p><p> <tt class="literal">Session</tt>也提供了一个<tt class="literal">contains()</tt>方法来判断是否一个实例处于这个session的缓存中。 </p><p> 要把所有的对象从session缓存中完全清除,请调用<tt class="literal">Session.clear()</tt>。 </p><p> 对于第二层缓存来说,在<tt class="literal">SessionFactory</tt>中定义了一些方法来从缓存中清除一个实例、整个类、集合实例或者整个集合。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="performance-querycache"></a>14.5. 查询缓存(Query Cache)</h2></div></div><div></div></div><p> 查询结果集也可以被缓存。只有当经常使用同样的参数进行查询时,这才会有些用处。要使用查询缓存,首先你要打开它,设置<tt class="literal">hibernate.cache.use_query_cache=true</tt>这个属性。这样会创建两个缓存区域——一个保存查询结果集(<tt class="literal">net.sf.hibernate.cache.QueryCache</tt>),另一个保存最近查询的表的时间戳(<tt class="literal">net.sf.hibernate.cache.UpdateTimestampsCache</tt>)。请注意查询缓存并不缓存结果集中包含实体的状态;它只缓存标识符属性的值和值类型的结果。所以查询缓存通常会和第二层缓存一起使用。 </p><p> 大多数查询并不会从缓存中获得什么好处,所以默认查询是不进行缓存的。要进行缓存,调用 <tt class="literal">Query.setCacheable(true)</tt>。这个调用会让查询在执行时去从缓存中查找结果,或者把结果集放到缓存去。 </p><p> 如果你要对查询缓存的失效政策进行精确的控制,你必须调用<tt class="literal">Query.setCacheRegion()</tt>来为每个查询指定一个命名的缓存区域。 </p><pre class="programlisting">List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger") .setEntity("blogger", blogger) .setMaxResults(15) .setCacheable(true) .setCacheRegion("frontpages") .list();</pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="querysql.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="toolsetguide.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 13 章 原生SQL查询 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 15 章 工具箱指南</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -