本文共 4434 字,大约阅读时间需要 14 分钟。
Caching是提高系统资源使用效率的重要机制。使用JDO进行数据管理同样提供了两级缓存的定义。JDO中的缓存允许对象被保留并快速返回,而无需额外调用数据存储。这两级缓存在DataNucleus中有以下两种类型:
可以将缓存视为一个Map,其中键是对象身份(JDO中身份是唯一的)。
默认情况下,Level 2 Cache是启用状态。你可以根据需要配置Level 2 Cache。控制Level 2 Cache的方式是通过 persistence 属性 datanucleus.cache.level2.type。你可以将其设置为所需的缓存类型:
javax.cache缓存在datanucleus-core插件中可用。EHCache、OSCaching、SwarmCache、Coherence、JCache、Cacheonix和Memcached缓存在插件中可用。
此外,你还可以控制Level 2缓存的操作模式。使用 persistence 属性 datanucleus.cache.level2.mode 来控制。默认值是 UNSPECIFIED,这意味着DataNucleus会缓存所有实体对象,除非实体被明确标记为不可缓存。其他选项包括:
对象会在提交事务时放入Level 2缓存。这意味着缓存中的对象是已持久化的数据存储对象。此外,如果在一个事务中删除了一个对象,则在提交事务时,该对象会从Level 2缓存中被移除(如果它存在)。
Level 2缓存是一个DataNucleus插件点,允许你提供自己的缓存(如果需要)。EHCache、Coherence等缓存的示例可以作为参考。
在大多数JDO应用中,你不需要手动控制Level 2 Cache的任何方面,除了指定哪些对象可以保留在缓存中。JDO允许你通过 cacheable 属性控制哪些对象会被缓存。默认情况下,cacheable属性设置为true。你可以将其设置为false以防止某些对象被缓存:
使用XML:
<类 name="MyClass" cacheable="false"> ... 类>
使用注解:
@Cacheable("false") public class MyClass { ... }
对于字段,你可以使用 cacheable 属性来控制是否缓存该字段的值。对于关系对象,你可以指定字段是否可缓存:
<类 name="MyClass"> <字段 name="values" /> <字段 name="elements" cacheable="false" /> ... 类>
如果一个字段是 cacheable 的:
DataNucleus通过元数据扩展允许你定义所有实体类的实例自动固定到Level 2缓存中。
@PersistenceCapable@Extension(vendorName="datanucleus", key="cache-pin", value="true") public class MyClass { ... }
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=javax.cachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.timeout={缓存超时(毫秒,非必需)}
DataNucleus提供一个简单的包装。这是将成为javax.cache的旧版本。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=jcachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.timeout={缓存超时(毫秒,非必需)}
DataNucleus提供一个简单的包装。当前使用Coherence的NamedCache接口实例化一个用户提供名称的缓存。要启用,请设置以下 persistence 属性:
datanucleus.cache.level2.type=coherencedatanucleus.cache.level2.cacheName={coherence缓存名称}
Coherence缓存名称是你在调用CacheFactory.getCache(name)时使用的名称。Coherence缓存不支持JDO接口中的pin和unpin操作。然而,你可以通过访问缓存直接获取更多控制权:
DataStoreCache cache = pmf.getDataStoreCache(); NamedCache coherenceCache = ((CoherenceLevel2Cache)cache).getCoherenceCache();
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=ehcachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.configurationFile={EHCache配置文件(在类路径中)}
EHCache插件还提供一个基于类的Level 2 Cache。你需要用"ehcacheclassbased"替换"ehcache"。
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=oscachedatanucleus.cache.level2.cacheName={缓存名称}
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=swarmcachedatanucleus.cache.level2.cacheName={缓存名称}
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=spymemcached [或 "xmemcached"]datanucleus.cache.level2.cacheName={前缀以避免与其他Memcached对象冲突}datanucleus.cache.level2.memcached.servers=...datanucleus.cache.level2.memcached.expireSeconds=...
datanucleus.cache.level2.memcached.servers 是一个包含Memcached主机和端口的空格分隔的列表,例如host:port host2:port。datanucleus.cache.level2.memcached.expireSeconds 如果未设置或设置为0,则没有超时。
DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:
datanucleus.cache.level2.type=cacheonixdatanucleus.cache.level2.cacheName={缓存名称}
你也可以 optionally 提供:
datanucleus.cache.level2.timeout={超时(毫秒,默认为60)}datanucleus.cache.level2.configurationFile={Cacheonix配置文件(在类路径中)}
并定义一个类似以下的 cacheonix-config.xml:
转载地址:http://ojrfk.baihongyu.com/