博客
关于我
Datanucleus 应用
阅读量:797 次
发布时间:2023-04-04

本文共 4434 字,大约阅读时间需要 14 分钟。

JDO : Caching

Caching是提高系统资源使用效率的重要机制。使用JDO进行数据管理同样提供了两级缓存的定义。JDO中的缓存允许对象被保留并快速返回,而无需额外调用数据存储。这两级缓存在DataNucleus中有以下两种类型:

  • 第一级缓存是JDO规范中定义的,表示在PersistenceManager中缓存对象实例。
  • 第二级缓存表示在PersistenceManagerFactory中缓存对象实例(跨多个PersistenceManager)。

可以将缓存视为一个Map,其中键是对象身份(JDO中身份是唯一的)。

Level 2 Cache

默认情况下,Level 2 Cache是启用状态。你可以根据需要配置Level 2 Cache。控制Level 2 Cache的方式是通过 persistence 属性 datanucleus.cache.level2.type。你可以将其设置为所需的缓存类型:

  • none:关闭Level 2缓存。
  • weak:使用基于弱引用(weak reference)的内部Level 2缓存。支持JDO 2接口中允许将对象固定到缓存中,并在需要时取消固定。这种选项仅在JVM的客户端应用程序中使用,不支持分布式缓存。
  • soft:使用基于软引用(soft reference)的内部Level 2缓存。支持JDO 2接口中允许将对象固定到缓存中,并在需要时取消固定。这种选项仅在JVM的客户端应用程序中使用,不支持分布式缓存。
  • 简单的EHCache包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 类别的EHCache包装。基于类的简单包装。
  • 简单的OSCaching包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 简单的SwarmCache包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 简单的Oracle Coherence包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。Oracle的缓存支持分布式缓存,因此在理论上可以在分布式环境中使用DataNucleus。
  • 简单的javax.cache包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 旧版本的javax.cache包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 简单的Spymemcached客户端包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 简单的XMemcached客户端包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。
  • 简单的Cacheonix分布式缓存软件包装。提供基本的缓存添加和检索功能,不支持固定和取消固定。

javax.cache缓存在datanucleus-core插件中可用。EHCache、OSCaching、SwarmCache、Coherence、JCache、Cacheonix和Memcached缓存在插件中可用。

此外,你还可以控制Level 2缓存的操作模式。使用 persistence 属性 datanucleus.cache.level2.mode 来控制。默认值是 UNSPECIFIED,这意味着DataNucleus会缓存所有实体对象,除非实体被明确标记为不可缓存。其他选项包括:

  • NONE:永远不缓存。
  • ALL:无论注释如何,所有实体都会被缓存。
  • ENABLE_SELECTIVE:仅缓存明确标记为可缓存的实体。
  • DISABLE_SELECTIVE:除非实体被明确标记为不可缓存,否则所有实体都会被缓存。

对象会在提交事务时放入Level 2缓存。这意味着缓存中的对象是已持久化的数据存储对象。此外,如果在一个事务中删除了一个对象,则在提交事务时,该对象会从Level 2缓存中被移除(如果它存在)。

Level 2缓存是一个DataNucleus插件点,允许你提供自己的缓存(如果需要)。EHCache、Coherence等缓存的示例可以作为参考。

控制Level 2 Cache

在大多数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 的:

  • 如果是可持久化的对象,相关对象的身份会被存储到Level 2缓存中。
  • 如果是Collection,缓存中会存储Collection中的元素的身份。
  • 如果是Map,缓存中会存储Map中的键和值的身份。

DataNucleus通过元数据扩展允许你定义所有实体类的实例自动固定到Level 2缓存中。

@PersistenceCapable@Extension(vendorName="datanucleus", key="cache-pin", value="true") public class MyClass { ... }

L2 Cache using javax.cache

DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:

datanucleus.cache.level2.type=javax.cachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.timeout={缓存超时(毫秒,非必需)}

L2 Cache using JCache

DataNucleus提供一个简单的包装。这是将成为javax.cache的旧版本。要启用,请设置 persistence 属性:

datanucleus.cache.level2.type=jcachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.timeout={缓存超时(毫秒,非必需)}

L2 Cache using Oracle Coherence

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();

L2 Cache using EHCache

DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:

datanucleus.cache.level2.type=ehcachedatanucleus.cache.level2.cacheName={缓存名称}datanucleus.cache.level2.configurationFile={EHCache配置文件(在类路径中)}

EHCache插件还提供一个基于类的Level 2 Cache。你需要用"ehcacheclassbased"替换"ehcache"。

L2 Cache using OSCaching

DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:

datanucleus.cache.level2.type=oscachedatanucleus.cache.level2.cacheName={缓存名称}

L2 Cache using SwarmCache

DataNucleus提供一个简单的包装。要启用,请设置 persistence 属性:

datanucleus.cache.level2.type=swarmcachedatanucleus.cache.level2.cacheName={缓存名称}

L2 Cache using Spymemcached/XMemcached

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,则没有超时。

L2 Cache using Cacheonix

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/

你可能感兴趣的文章
mysql 索引类型以及创建
查看>>
MySQL 索引连环问题,你能答对几个?
查看>>
Mysql 索引问题集锦
查看>>
Mysql 纵表转换为横表
查看>>
mysql 编译安装 window篇
查看>>
mysql 网络目录_联机目录数据库
查看>>
MySQL 聚簇索引&&二级索引&&辅助索引
查看>>
Mysql 脏页 脏读 脏数据
查看>>
mysql 自增id和UUID做主键性能分析,及最优方案
查看>>
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>