Hibernate的缓存处理

王朝other·作者佚名  2006-05-19
宽屏版  字体: |||超大  

20.2.1. 缓存映射(Cache mappings)

类或者集合映射的“<cache>元素”可以有下列形式:

<cache

usage="transactional|read-write|nonstrict-read-write|read-only" (1)

/>

(1)

usage说明了缓存的策略: transactional、 read-write、 nonstrict-read-write或 read-only。

另外(首选?), 你可以在hibernate.cfg.xml中指定<class-cache>和 <collection-cache> 元素。

这里的usage 属性指明了缓存并发策略(cache concurrency strategy)。

20.2.2. 策略:只读缓存(Strategy: read only)

如果你的应用程序只需读取一个持久化类的实例,而无需对其修改, 那么就可以对其进行只读 缓存。这是最简单,也是实用性最好的方法。甚至在集群中,它也能完美地运作。

<class name="eg.Immutable" mutable="false">

<cache usage="read-only"/>

....

</class>

20.2.3. 策略:读/写缓存(Strategy: read/write)

如果应用程序需要更新数据,那么使用读/写缓存 比较合适。 如果应用程序要求“序列化事务”的隔离级别(serializable transaction isolation level),那么就决不能使用这种缓存策略。 如果在JTA环境中使用缓存,你必须指定hibernate.transaction.manager_lookup_class属性的值, 通过它,Hibernate才能知道该应用程序中JTA的TransactionManager的具体策略。 在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束。 如果你想在集群环境中使用此策略,你必须保证底层的缓存实现支持锁定(locking)。Hibernate内置的缓存策略并不支持锁定功能。

<class name="eg.Cat" .... >

<cache usage="read-write"/>

....

<set name="kittens" ... >

<cache usage="read-write"/>

....

</set>

</class>

20.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write)

如果应用程序只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离, 那么比较适合使用非严格读/写缓存策略。如果在JTA环境中使用该策略, 你必须为其指定hibernate.transaction.manager_lookup_class属性的值, 在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束

-------------------------------------------------------------------------

在jBPM 中使用不少这样的非严格读/写缓存的处理:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

<class name="org.jbpm.context.def.VariableAccess"

table="JBPM_VARIABLEACCESS"

lazy="false">

<cache usage="nonstrict-read-write"/>

<id name="id" column="ID_"><generator class="native" /></id>

<property name="variableName" column="VARIABLENAME_" />

<property name="access" column="ACCESS_" />

<property name="mappedName" column="MAPPEDNAME_" />

</class>

</hibernate-mapping>

它的ehcache.xml 是这样配置的:

<ehcache>

<defaultCache

maxElementsInMemory="100000"

eternal="true"

overflowToDisk="false"

diskPersistent="false"

/>

</ehcache>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有