Java Caching JSR107介绍(二)

1.CacheManager

 获取默认的CacheManager

通过Caching助手类获取CachingProvider,然后通过CachingProvider获取默认的CacheManager。
//获取默认的CachingProvider
CachingProvider provider = Caching.getCachingProvider();
//获取默认的CacheManager
CacheManager manager = provider.getCacheManager();

而获取非默认或者自定义配置的CacheManager,例如自定义的ClassLoader或者缓存实现的属性,需要使用CachingProvider的带参数的getCacheManager方法。

 配置缓存

有两种通过CacheManager配置缓存的方法:
●通过CacheManager.createCache,可以运行期通过编程方式配置缓存。
●CacheManager提供了通过声明方式配置缓存的机制,以避免使用createCache方法。
CacheManager声明式定义缓存的机制依赖于实现。一个方法是通过XML文件方式配置CacheManager及其内的Cache。
Java Cache API定义了javax.cache.configuration.Configuration的配置接口及实现类javax.cache.configuration.MutableConfiguration。
CacheManager有对应用的缓存配置项进行校验的职责,当缓存的配置项无效时,应该抛出IllegalArgumentException。

Cache的名称和作用域

Cache在CacheManager的作用域内通过配置的唯一名称作为标识,Cache通过这个CacheManager创建和访问Cache。通过不同URI的不同CacheManager创建的相同名称的Cache,被认为是不同Cache,在这种情况下,相同名称的Cache其配置和内容可能是不同的。
Cache的名称用字符串表示,有一些约束及为可移植性考虑的建议:
●以java.或javax.are开头的名称作为内部平台的Cache使用而保留。
●Cache名称不应该包含斜杠(/)和冒号(:),这些字符经常用于JavaEE环境的基于JNDI的查询。
●Cache名称可以使用Unicode字符。

获得Cache

有两种通过CacheManager获得Cache的方法。
●当需要类型安全的Cache时,为确保使用正确和希望的缓存条目类型,应该使用下面的方法:
<K, V> Cache<K, V> getCache(String cacheName,
                            Class<K> keyType,
                            Class<V> valueType)

●当应用程序本身负责缓存条目的类型安全时,应使用下面的方法:
<K, V> Cache<K, V> getCache(String cacheName)

Cache和CacheManager的生命周期

所用的Cache和CacheManager实例都处于两个状态中的一个状态,即opened或closed。当为opened时,实例可以进行操作,如在缓存中创建、更新和删除条目,或者在CacheManager中配置、获得、关闭和删除一个cache。当实例为closed状态时,任何对实例的操作将抛出IllegalStateException异常。

关闭Cache

通过Cache.close()方法关闭一个Cache,同时告诉CacheManager该Cache不再需要管理。这时对于CacheManager来说:
●CacheManager必须关闭和释放Cache使用的所有资源,包括配置的CacheLoader, CacheWriter, 注册并实现了java.io.Closeable接口的CacheEntryListeners和ExpiryPolicy实例。
●阻止事件传递到注册到Cache的CacheEntryListeners。
●调用CacheManager的getCacheNames()方法不返回关闭状态的Cache名称。

销毁Cache

要销毁Cache,从被管理中释放,删除所有缓存项,从而允许新的Cache具有相同的名称,但可以具有一个不同的配置,这时需要调用CacheManager的destroyCache方法。
Cache一旦被销毁:
●任何对该Cache实例的操作将抛出IllegalStateException。
●可以通过调用CacheManager.create创建一个和被销毁的Cache同名的Cache,可以使用相同或不同的配置。
Cache一旦被销毁,通过CacheManager将不能再得到。销毁Cache确保其关闭,所有相关的条目对任何应用程序不再可用。

关闭CacheManager

通过调用CacheManager.close()或CachingProvider.close(...)方法关闭CacheManager,表示:
●关闭所有当前被管理的Cache。
●释放所有当前被管理的Cache使用的资源。
CacheManager一旦关闭,任何尝试在已经关闭的CacheManager上或者被管理的Cache上进行操作,将抛出IllegalStateException。

2.Cache

Cache的类型安全

Java的缓存API大量使用由JSR-14定义的Java泛型,可以开发出编译时类型安全的应用。
虽然如此,编译时类型安全性并不能保证使用缓存的应用程序运行时的类型正确性。对于一些缓存的拓扑结构,特别是那些存储或跨Java进程边界访问缓存对象的情况,Java运行时类型信息擦除以及无法获取和传输泛型类型的信息,可能使得应用程序无法确保缓存操作的类型安全。缓存应始终注意确保缓存配置使用适当的键和值类型,以便在必要的情况下进行类型检查。

编译时类型安全

编译时类型安全是通过声明一个缓存所要求的泛型类型来提供的。
例子:在下面的示例中缓存被声明为String类型的键和Integer类型的值。当这个缓存交互时指定的值不兼容就会产生编译时错误。
    Configuration config = new MutableConfiguration();
    //创建cache
    cacheManager.createCache(cacheName, config);
    //获得cache
    Cache<String, Integer> cache = cacheManager.getCache(cacheName);
    //使用cache
    String key = "key";
    Integer value1 = 1;
    cache.put("key", value1);
    Integer value2 = cache.get(key);
    //下面的代码将编译失败-类型不正确
    //cache.put(2, “some value);

虽然可以通过使用原始类型(不指定泛型类型参数)声明一个缓存来绕过编译时类型安全检查,但它不是一个推荐的做法,因为它不能避免简单的编程时类型错误。

运行时类型安全

除了编译时的类型安全性,开发人员可以通过缓存配置启用与特定的键类型和值类型的运行时类型安全。例如,MutableConfiguration类提供了以下方法来定义所需要的键和值类型的缓存。
  /**
   * Sets the expected type of keys and values for a {@link javax.cache.Cache}
   * configured with this {@link Configuration}. Setting both to <code>null</code>
   * means type-safety checks are not required.
   *
   * @param keyType   the expected key type
   * @param valueType the expected value type
   * @return the {@link MutableConfiguration} to permit fluent-style method calls
   */
  public MutableConfiguration<K, V> setTypes(Class<K> keyType, Class<V> valueType)

当一个配置定义了键和值的类型,通过CacheManager.getCache返回的缓存必须确保所请求的键和值的类型和配置的一样。获得一个与特定的键和值的类型的缓存,必须使用下面的CacheManager方法。
 <K, V> Cache<K, V> getCache(String cacheName,
                             Class<K> keyType,
                             Class<V> valueType);

缓存的实现无需保证或在缓存操作时执行键和值的运行时类型检查。然而,当使用getCache方法要求返回与特定类型的缓存时,他们必须确保返回的是配置了特定类型的缓存。
当使用上述方法时,实现必须确保返回的缓存已明确配置为调用方法时指定的类型。这种方法为开发人员提供的安全级别超出了单纯使用泛型提供的安全级别。
当配置中没有指定键和值的类型,或者都指定为Object类型,当获取Cache时实现不会执行有效期类型检查。这种情况下使用:
 <K, V> Cache<K, V> getCache(String cacheName);
当尝试使用getCache而不提供类型参数,而该缓存是已经配置了特定类型或是通过使用特定类型参数调用getCache而获得,或者通过指定的类型参数去获取已经被配置为特定类型的缓存时,都会导致IllegalArgumentException异常被抛出。
例子:在这个例子中缓存被配置为字符的串键类型和Integer值类型,实施则确保声明的类型和配置的缓存匹配,否则抛出IllegalArgumentException。
    CachingProvider cachingProvider = Caching.getCachingProvider();
    CacheManager cacheManager = cachingProvider.getCacheManager();

    MutableConfiguration<String, Integer> config = new
        MutableConfiguration<String, Integer>();
    config.setTypes(String.class, Integer.class);
    cacheManager.createCache("simpleCache", config);
    Cache<String, Integer> simpleCache = cacheManager.getCache("simpleCache",
        String.class, Integer.class);

    simpleCache.put("key1", 3);
    Integer value2 = simpleCache.get("key1");


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值