Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7615688 建立时间:2006年5月29日 |

| |
[Hibernate]Hibernate的缓存处理 软件技术, 电脑与网络
lhwork 发表于 2006/6/30 16:15:45 |
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> |
|
|