项目使用 spring+springMVC+mybatis+redis 框架,redis 实现了mybatis 的二级缓存,Jedis 客户端。
现在的问题是,一旦在运行中redis 挂掉,比如我手动把它停掉,整个使用缓存的查询都用不了了,因为jedis会报 JedisConnectionException,是一种 RuntimeException。
那有没有方法让 redis server 连接失败时,通知mybatis 去db 查询,而不是死磕redis 呢?相当于让项目直接绕过redis 进行工作。
苦恼,有没有做过的前辈给指点指点,感激不尽!
现在的问题是,一旦在运行中redis 挂掉,比如我手动把它停掉,整个使用缓存的查询都用不了了,因为jedis会报 JedisConnectionException,是一种 RuntimeException。
那有没有方法让 redis server 连接失败时,通知mybatis 去db 查询,而不是死磕redis 呢?相当于让项目直接绕过redis 进行工作。
苦恼,有没有做过的前辈给指点指点,感激不尽!
解决方案 »
- java打开中文名附件就报错(没法识别中文字符)
- 第一个JSP
- Linux如何自动排程
- 这样播放多首歌?
- 求助jfreechart画曲线图
- struts2 定义了全局的拦截器,个别action定义了自己的拦截器,然后个别的action进不去全局的拦截器
- tomcat问题,不能从开始菜单以服务形式启动
- 做一个优秀的论坛!(可惜最多只能加100分,不知有什么方法,可以再多加些分)
- 我快疯了!关于Iplanet 6中JSP的中文显示问题,高分求救!
- 请帮帮忙
- 请问如何在<c:foreach>里用<fmt:formatDate>?
- javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to t
道理是如此,问题是如何通知mybatis,mybatis 只能处理cache 为null,为{} 空,不知道怎样用代码手动控制其去查询 db
咱们可以尝试从程序设计的角度开始,
1.抽象 缓存管理对象 CacheManager set(),get(),
2.项目中的缓存实现 RedisCacheImpl,本地也有缓存,LocalCacheImpl ,等等。
3.CacheFacade 包含一个测试redis连通性的方法,注入CacheManager 对象,
伪代码:
public class CacheFacade {
private CacheManager cache;
//获取缓存代码实现
public Object get(){
}
//
public boolean testCache(){
}
}
利用好java的aop。对方法进行有效切割,达到预期效果。
/**
* 获取缓存,不存在时调用方法进行填充
* @param key 缓存key
* @param cacheSecond 缓存时长,单位秒
* @param fillWhileNoFound 缓存不存在时的数据获取方法,用于填充缓存
* @param <T> 缓存数据类型
* @return 缓存数据
* @throws Exception 方法的异常
*/
public static<T> T getCache(String key, int cacheSecond, Callable fillWhileNoFound) throws Exception {
Object ret = redis.opsForValue().get(key);
if (ret != null)
return (T) ret;
try {
ret = fillWhileNoFound.call();
if (ret == null) {
return null;
}
}catch (Exception exp){
log.error(exp.toString());
}
redis.opsForValue().set(key, ret, Duration.ofSeconds(cacheSecond));
return (T) ret;
}