标签: jcache

Google App Engine - JCache还是Memcache API?

使用JCache(JSR 107)或Memcache API与Google App Engine有任何优点和/或缺点吗?如果是这样,他们是什么?

java google-app-engine memcached jcache

9
推荐指数
1
解决办法
2474
查看次数

何时使用Java Cache以及它与HashMap的区别?

我已经javax.cache.Cache了解了它的用法和行为.据说,

JCache是​​一种类似Map的数据结构,可以提供应用程序数据的临时存储.

JCache和HashMap将元素存储在本地堆内存中,默认情况下没有持久性行为.通过实现自定义CacheLoader,CacheWriter我们可以实现持久性.除此之外,何时使用它?

java caching hashmap jcache

8
推荐指数
2
解决办法
3339
查看次数

使用 Spring Boot 2.1+ 为 Hibernate 配置缓存

背景和问题

我正在尝试在 Spring Boot 2.2 中使用 Hibernate 配置 EHCache,但似乎我做错了什么。我查看了几个教程和 SO 问题,但没有找到与我的方法完全匹配的内容。

我为缓存选择了无 XML、jcache 配置的方法。但是,Hibernate 没有检测到现有的缓存管理器(我检查甚至强制执行@AutoconfigureBefore:缓存管理器在 Hibernate 自动配置之前加载)。结果,Hibernate 创建了第二个EhcacheManager并抛出了几个警告,例如:

HHH90001006: Missing cache[com.example.demo.one.dto.MyModel] was created on-the-fly. The created cache will use a provider-specific default configuration: make sure you defined one. You can disable this warning by setting 'hibernate.javax.cache.missing_cache_strategy' to 'create'.
Run Code Online (Sandbox Code Playgroud)

我尝试使用 aHibernatePropertiesCustomizer来告诉 Hibernate 它应该使用哪个缓存管理器。bean 已实例化,但从未被调用,因此它失去了所有吸引力和用途。

有人知道我做错了什么以及我应该如何让 Hibernate 使用我已经配置的缓存管理器而不是创建自己的缓存管理器吗?

我将我的配置与JHipster生成的配置进行了比较。它看起来非常相似,尽管它们HibernatePropertiesCustomizer 称为。我没有成功确定他们的缓存配置和我的缓存配置之间的差异。

后期测试的笔记(编辑)

这似乎与我的数据源配置有关(请参阅下面的代码)。我尝试删除它并以更简单的方式启用我的 JPA 配置,并且HibernatePropertiesCustomizer确实按预期调用。

HHH90001006: Missing cache[com.example.demo.one.dto.MyModel] was …
Run Code Online (Sandbox Code Playgroud)

hibernate jcache spring-boot ehcache-3 spring-boot-2

7
推荐指数
1
解决办法
3627
查看次数

Spring cache/jsr107:列表/集合参数作为键的一部分

我有一个服务,它调用外部系统通过外部 ID 检索某种对象并将它们提交回更新。有一种更通用的方法,而不是一个接一个地检索对象:

public interface ExternalSystem {
    List<ExternalDTO> getObjects(List<String> externalIds);

    void updateObjects(List<ExternalDTO> updates);
}
Run Code Online (Sandbox Code Playgroud)

我想在外部系统调用之上放置一个缓存,因为它们非常昂贵。

在服务的实现中我可以简单地添加spring注释:

@Cacheable("cache-external")
List<ExternalDTO> getObjects(List<String> externalIds) {} 

@CacheEvict(cacheNames="cache-external", allEntries=true)
void updateObjects(List<ExternalDTO> updates);
Run Code Online (Sandbox Code Playgroud)

但是,如果 externalId 之间有很多交集,这样的缓存会表现得非常糟糕,即

  1. Call#1 getObjects([1,2,3,4]) -> 通过 [1,2,3,4] 键缓存
  2. Call#2 getObjects([1,2,3,4,5]) -> 通过 [1,2,3,4,5] 键缓存
  3. Call#3 getObjects([6,7,8,9]) -> 通过 [6,7,8,9] 键缓存
  4. Call#4 updateObjects( 1 ) -> 逐出所有缓存,但第三个缓存不包含 3

所以,问题是如何实现自定义策略(我认为它不能开箱即用),该策略将仅逐出那些真正应该逐出的条目,并使键以从缓存中检索相交对象的方式?

更新。我发现了两个类似的问题:

  1. spring-cache-abstraction-with-multi-value-queries 弹簧缓存抽象与多值查询
  2. 使用 spring-cache-on-methods-take-array-or-collection
  3. spring-cacheable-methods-with-lists 弹簧可缓存方法与列表

更新2。 这与我想要的类似,只是我将为集合中的每个项目放入 String 和ExternalDTO 的缓存对。 列表到列表的元素级缓存

java spring caching jcache jsr107

6
推荐指数
1
解决办法
9562
查看次数

缓存关闭导致运行测试套件时出现异常

我遇到了与此问题中描述的类似的问题。

我有一个在开发环境中运行良好的测试套件。在 Bitbucket Pipelines 中执行时,其中一项测试失败,但出现以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: Cache[model.Role] is closed; nested exception is java.lang.IllegalStateException: Cache[model.Role] is closed
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:364)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
   ....
Run Code Online (Sandbox Code Playgroud)

我想尝试接受的解决方案,但我不知道如何将其应用到我的项目中。第二种解决方案依赖于ehcache.xml 文件。我没有这个文件,一切都在JavaConfig中配置。如何在 JavaConfig 中采用EhCache + JCache (JSR-107) 的建议解决方案?

我的缓存配置:

@Configuration
@EnableCaching
public class CacheConfig {

    private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration =
            Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder
                    .newCacheConfigurationBuilder(Object.class, Object.class,
                            ResourcePoolsBuilder.newResourcePoolsBuilder()
                                    .heap(100, EntryUnit.ENTRIES))
                    .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(60)))
                    .build());

    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> {
            createIfNotExists(cm, "model.Role");
            createIfNotExists(cm, "model.User.roles");
            // ...
        };
    }

    private …
Run Code Online (Sandbox Code Playgroud)

ehcache spring-test shared-cache jcache

6
推荐指数
1
解决办法
5136
查看次数

JCache API(JSR 107)是Java EE的一部分吗?

谷歌搜索了很长一段时间,无法找到任何关于此的信息.

我不是100%确定它是否是Java EE平台的一部分,但我的直觉是它不是.虽然,似乎大多数符合Java EE的应用程序容器都使用/或允许使用缓存系统.

它是Java SE的一部分吗?

或者它只是一个独立的规范?

caching java-ee jcache

5
推荐指数
1
解决办法
1531
查看次数

如何在Spring Java配置中创建Jcache?

我在使用spring cache abstraction设置jcache时遇到问题.

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean(name = "caffeineCachingProvider")
    public CachingProvider caffeineCachingProvider() {
        return new CaffeineCachingProvider();
    }

    @Bean(name = "caffeineCacheManager")
    public JCacheCacheManager getSpringCacheManager() {
        CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
        CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
        caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
        Cache<String, List<Product>> productCache = cacheManager.createCache("productCache", caffeineConfiguration);

        JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
        return jCacheCacheManager;
    }

} 
Run Code Online (Sandbox Code Playgroud)

我正在使用Caffein作为Jcache.我只是无法理解我做错了什么.你能解释一下如何正确地做到这一点吗?

我得到的是NPE在线cacheManager.createCache(...)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caffeineCacheManager' defined in com.myapp.spring.config.CacheConfig: Bean instantiation via factory method …
Run Code Online (Sandbox Code Playgroud)

java spring jcache spring-cache caffeine

5
推荐指数
1
解决办法
2332
查看次数

JCache (JSR107) 是否允许不同条目的不同到期持续时间?

假设我想缓存昂贵的方法调用的结果。这些缓存条目应具有不同的到期持续时间(又名 TTL)。如果将条目放入同一个 Cache 实例中,这对 JCache 是否可行?

我知道我可以为每个缓存分配不同的 ExpiryPolicy。但是我想知道是否可以单独为 CacheEntry 分配到期持续时间。

JCache 支持吗?如果是这样,我会很感激这个代码示例的链接。这个问题的范围纯粹是 JCache,没有任何特定于实现的功能。

java caching jcache cache-expiration

5
推荐指数
1
解决办法
1106
查看次数

JCache 具有多个缓存提供程序?

我故意在我的类路径中添加了几个不同的缓存提供程序。我有用于分布式缓存的 Hazelcast 和用于本地缓存的 Caffeine。我正在尝试使用 JCache (JSR107) 注释来缓存我的值。

我已经创建了一个 CacheResolverFactory ,它将能够检测要从哪个提供程序使用哪个缓存管理器(基于方法注释),但是当我启动应用程序时,我收到以下错误消息:

Exception in thread "Thread-2" javax.cache.CacheException: Multiple CachingProviders have been configured when only a single CachingProvider is expected
    at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:386)
    at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:361)
    at javax.cache.Caching.getCachingProvider(Caching.java:151)
    at org.jsr107.ri.annotations.DefaultCacheResolverFactory.<init>(DefaultCacheResolverFactory.java:59)
    at org.jsr107.ri.annotations.cdi.CacheLookupUtil.<init>(CacheLookupUtil.java:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
Run Code Online (Sandbox Code Playgroud)

显然,我知道我有多个缓存提供程序。但是,我似乎无法找到有关此问题的任何信息。该类org.jsr107.ri.annotations.cdi.CacheLookupUtil有一个私有 CacheResolverFactory 成员,该成员在构造时初始化为需要单个 CacheProvider 的 DefaultCacheResolverFactory()。

public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
    @Inject
    private BeanManagerUtil beanManagerUtil;
    private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
    private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();
...
...
}
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来避免这个问题吗?JCache …

java jcache jsr107

5
推荐指数
1
解决办法
2511
查看次数

Infinispan-10.0.1.Final:没有为 Java 类型 java.util.UUID 注册编组器

从 9.4.16.Final --> 10.0.1.Final 升级 infinispan-jcache 后,由于编组器错误,我无法使用缓存。

https://infinispan.org/blog/

我希望它与 javax.cache.* 一起使用,v9.4.16.Final 就是这种情况。没有使用与 infinispan 相关的类。

在 v10.0.1.Final 中,我可以从缓存中放入和检索 UUID。但是在设置 CacheLoaderFactory 时失败。

进口

import javax.cache.Cache;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.Duration;
import javax.cache.expiry.ModifiedExpiryPolicy;
import javax.cache.integration.CacheLoader;
import javax.cache.integration.CacheLoaderException;
Run Code Online (Sandbox Code Playgroud)

代码:

final var cachingProvider = Caching.getCachingProvider();
final var cacheManager = cachingProvider.getCacheManager();
final var config = new MutableConfiguration<String,UUID>();
config.setTypes( String.class, UUID.class );
config.setStoreByValue( false );
config.setExpiryPolicyFactory( ModifiedExpiryPolicy.factoryOf( Duration.FIVE_MINUTES ) );
config.setReadThrough( true );
config.setCacheLoaderFactory( () -> new CacheLoader<>() {
    @Override
    public UUID load(String key) throws …
Run Code Online (Sandbox Code Playgroud)

java caching infinispan jcache

4
推荐指数
1
解决办法
1827
查看次数