Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于缓存抽象的Spring boot缓存故障切换机制_Java_Spring_Caching_Spring Boot_Spring Data - Fatal编程技术网

Java 基于缓存抽象的Spring boot缓存故障切换机制

Java 基于缓存抽象的Spring boot缓存故障切换机制,java,spring,caching,spring-boot,spring-data,Java,Spring,Caching,Spring Boot,Spring Data,我正在我的代码中研究SpringDataRedis和缓存抽象。 我在缓存抽象中使用了redis作为缓存服务器。 每当我访问JPARepository获取数据时,缓存抽象都会有所帮助。 它第一次执行方法从数据库中获取数据,第二次以后从缓存中获取数据 我的主要问题是: 是否有一种缓存抽象方法可以识别缓存服务器未启动, 因此,它应该再次执行该方法以从db获取数据,而不是在尝试从缓存获取数据时卡住 代码如下: 要配置缓存,请执行以下操作: @Configuration @EnableCaching pu

我正在我的代码中研究SpringDataRedis和缓存抽象。 我在缓存抽象中使用了redis作为缓存服务器。 每当我访问JPARepository获取数据时,缓存抽象都会有所帮助。 它第一次执行方法从数据库中获取数据,第二次以后从缓存中获取数据

我的主要问题是:
是否有一种缓存抽象方法可以识别缓存服务器未启动, 因此,它应该再次执行该方法以从db获取数据,而不是在尝试从缓存获取数据时卡住

代码如下:

要配置缓存,请执行以下操作:

@Configuration
@EnableCaching
public class CacheConfig {

@Autowired
private ApplicationContext applicationContext;

/*  below code is specific to redis implementation */



        @Bean
        public RedisConnectionFactory redisConnectionFactory(@Value("${redis.host}") String redisHost,
        @Value("${redis.port}") Integer redisPort) {
            JedisConnectionFactory cf = new JedisConnectionFactory();
            cf.setHostName(redisHost);
            cf.setPort(redisPort);
            return cf;
        }

        @Bean(name="redisTemplate")
        RedisTemplate redisTemplate() 
        {
            final RedisTemplate template =  new RedisTemplate();
            template.setConnectionFactory(applicationContext.getBean(RedisConnectionFactory.class));
            return template;
        }

        @Bean
        public CacheManager cacheManager() {
            RedisCacheManager redisCacheManager = new RedisCacheManager((RedisTemplate) applicationContext.getBean("redisTemplate"));
            redisCacheManager.setTransactionAware(true);
            redisCacheManager.setUsePrefix(true);
            return redisCacheManager;
        }
}

使用缓存的代码:

@Override
@Cacheable(value = IC_CACHE, key = "#id")
public IssueCategory getIssueCategoriesById(Integer id) {
    return issueCategoriesRepo.findById(id);
}
现在假设redis停止工作或从后面关机。 它给出了以下例外情况:

java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于redis.clients.jedis.Connection.connect(Connection.java:144)
位于redis.clients.jedis.BinaryClient.connect(BinaryClient.java:71)
位于redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1783)
位于redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:65)
位于org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836)
位于org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434)
位于org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361)
位于redis.clients.util.Pool.getResource(Pool.java:40)
位于redis.clients.jedis.JedisPool.getResource(JedisPool.java:84)
位于redis.clients.jedis.JedisPool.getResource(JedisPool.java:10)
位于org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:133)
位于org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:229)
位于org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:57)
位于org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:128)
位于org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:91)
位于org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:78)
位于org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:177)
位于org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152)
位于org.springframework.data.redis.cache.RedisCache.get(RedisCache.java:88)
位于org.springframework.cache.transaction.TransactionAwareCacheDecorator.get(TransactionAwareCacheDecorator.java:66)
位于org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:68)
位于org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:461)
位于org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:432)
位于org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:333)
位于org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:299)
位于org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
位于com.sun.proxy.$Proxy113.getIssueCategorisById(未知来源)
位于com.somexyz.somemodule.service.impl.RulesEngineServiceImpl.GetApplicatableNodes(RulesEngineServiceImpl.java:94)
位于com.somexyz.somemodule.web.api.somemoduleAPIController.getapplicatableNodes(somemoduleAPIController.java:35)
在com.somexyz.somemodule.web.api.somemoduleAPIController$$FastClassBySpringCGLIB$$1dabf625.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上
位于com.somexyz.somemodule.web.config.ResponseTimeInterceptor.invokeUnderTrace(ResponseTimeInterceptor.java:23)
位于org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke(AbstractTraceInterceptor.java:112)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
在com.somexyz.somemodule.web.api.somemoduleAPIController$$EnhancerBySpringCGLIB$$c8dbe185.getapplicatablenodes()上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
位于org.springframework.web.servlet.mvc.m