hibernate Spring Boot项目中的程序性RedissonClient

qni6mghb  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(182)

我正在尝试使用Redisson在一个Spring引导项目中实现Hibernate二级缓存。
我一直关注这个博客作为参考
https://pavankjadda.medium.com/implement-hibernate-2nd-level-cache-with-redis-spring-boot-and-spring-data-jpa-7cdbf5632883
另外,我正在尝试以编程方式而不是通过声明方式/通过配置文件来初始化RedissionClient
创建了一个要初始化的Spring Bean,它应该创建RedissonClient示例。

@Configuration
@Lazy(value = false)
public class RedissonConfig {
    
    @Bean
    public RedissonClient redissionClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
        
    }

}

然而,这个Bean从未被初始化,在应用程序启动时我得到了以下错误。

Caused by: org.hibernate.cache.CacheException: Unable to locate Redisson configuration
at org.redisson.hibernate.RedissonRegionFactory.createRedissonClient(RedissonRegionFactory.java:107) ~[redisson-hibernate-53-3.12.1.jar:3.12.1]
at org.redisson.hibernate.RedissonRegionFactory.prepareForUse(RedissonRegionFactory.java:83) ~[redisson-hibernate-53-3.12.1.jar:3.12.1]

似乎Spring Boot Hibernate仍在尝试通过配置文件加载Redisson配置。
是否有可能以编程方式在Spring Boot中加载Redission配置?
诚挚的问候,
萨乌拉夫

szqfcxe2

szqfcxe21#

这是可能的,但是您需要向Hibernate提供RegionFactory的定制实现,它可以扩展RedissonRegionFactory,但使用您自己的客户端示例。

ma8fv8wu

ma8fv8wu2#

我就是这么做的,下面是我是怎么做的:
1.您需要一个定制的RegionFactory,它类似于JndiRedissonRegionFactory,但以某种方式注入了它的RedissonClient
1.将这个类的一个完全配置的示例放入Hibernate属性Map中。Hibernates内部代码很灵活:如果hibernate.cache.region.factory_class的值是一个字符串,则将其视为FQDN。如果它是Class<?>的示例,它将被示例化。如果它是一个对象,它将被使用。
Spring提供了一种使用Bean定制Hibernate属性的非常简单的方法:

@AutoConfiguration(after = RedissonAutoConfiguration.class, before = JpaAutoConfiguration.class)
@ConditionalOnProperty("spring.jpa.properties.hibernate.cache.use_second_level_cache")
public class HibernateCacheAutoConfiguration {
    @Bean
    public HibernatePropertiesCustomizer setRegionFactory(RedissonClient redisson) {
        return hibernateProperties -> hibernateProperties.put(AvailableSettings.CACHE_REGION_FACTORY, new SpringBootRedissonRegionFactory(redisson));
    }
}

我的RegionFactory非常简单:

@AllArgsConstructor
public class SpringBootRedissonRegionFactory extends RedissonRegionFactory {

    private RedissonClient redissonClient;

    @Override
    protected RedissonClient createRedissonClient(Map properties) {
        return redissonClient;
    }

    @Override
    protected void releaseFromUse() {
    }

}

我使用redisson-starter获得了RedissonClient,因此引用了RedissonAutoConfiguration,但您可以只手动创建一个示例。

相关问题