Lettuce连接池超时问题简单记录
使用Lettuce连接池,隔一段时间不连,再去连,就出现超时问题
- 问题分析定位
- 解决方案
- 方案一
- 方案二
问题分析定位
一直连着没问题,只要间隔一段时间不连,再去连的时候就会出现超时问题,超时几次后就可以连上,再去操作就没问题,但是再次间隔一段时间去连,又会出现超时问题。
所以,问题不是出在代码逻辑上,而是出现在lettuce连接池上面!
解决方案
第一种. 简单直接 ,换jedis连接池(缺陷:还是没解决lettuce超时问题);
第二种. 找到超时原因 ,解决它;
方案一
第一步:添加maven依赖(排除lettuce,添加jedis)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
第二步:改配置
redis:open: false # 是否开启redis缓存 true开启 false关闭database: 0host: 127.0.0.1port: 6379password: # 密码(默认为空)timeout: 6000ms # 连接超时时长(毫秒)jedis:pool:max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 10 # 连接池中的最大空闲连接min-idle: 5 # 连接池中的最小空闲连接
第三步:修改配置类
@Configuration
public class RedisConfig {@Autowiredprivate RedisConnectionFactory factory;@Beanpublic RedisTemplate<String, Object> redisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(factory);return redisTemplate;}@Beanpublic HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForHash();}@Beanpublic ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {return redisTemplate.opsForValue();}@Beanpublic ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForList();}@Beanpublic SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForSet();}@Beanpublic ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForZSet();}
}
以上三步就可以了,这里贴出来一个redis工具类,省得来回找了;
@Component
public class RedisUtils {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate ValueOperations<String, String> valueOperations;@Autowiredprivate HashOperations<String, String, Object> hashOperations;@Autowiredprivate ListOperations<String, Object> listOperations;@Autowiredprivate SetOperations<String, Object> setOperations;@Autowiredprivate ZSetOperations<String, Object> zSetOperations;/** 默认过期时长,单位:秒 */public final static long DEFAULT_EXPIRE = 60 * 60 * 24;/** 不设置过期时长 */public final static long NOT_EXPIRE = -1;private final static Gson gson = new Gson();public void set(String key, Object value, long expire){valueOperations.set(key, toJson(value));if(expire != NOT_EXPIRE){redisTemplate.expire(key, expire, TimeUnit.SECONDS);}}public void set(String key, Object value){set(key, value, DEFAULT_EXPIRE);}public <T> T get(String key, Class<T> clazz, long expire) {String value = valueOperations.get(key);if(expire != NOT_EXPIRE){redisTemplate.expire(key, expire, TimeUnit.SECONDS);}return value == null ? null : fromJson(value, clazz);}public <T> T get(String key, Class<T> clazz) {return get(key, clazz, NOT_EXPIRE);}public String get(String key, long expire) {String value = valueOperations.get(key);if(expire != NOT_EXPIRE){redisTemplate.expire(key, expire, TimeUnit.SECONDS);}return value;}public String get(String key) {return get(key, NOT_EXPIRE);}public void delete(String key) {redisTemplate.delete(key);}/*** Object转成JSON数据*/private String toJson(Object object){if(object instanceof Integer || object instanceof Long || object instanceof Float ||object instanceof Double || object instanceof Boolean || object instanceof String){return String.valueOf(object);}return gson.toJson(object);}/*** JSON数据,转成Object*/private <T> T fromJson(String json, Class<T> clazz){return gson.fromJson(json, clazz);}
}
方案二
既然是长时间没有连导致的链接超时,那连一个就好了,就像心跳一样,这样链接池就不会关闭了;
搜来的方案先贴出来:(思路可行,后期校验)
1.定时校验来解决
/*** 每隔2秒校验异常lettuce连接是否正常,解决长期空闲lettuce连接关闭但是netty不能及时监控到的问题* @author hujun*/
@Component
@Slf4j
public class LettuceConnectionValidTask {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Scheduled(cron="0/2 * * * * ?")public void task() {if(redisConnectionFactory instanceof LettuceConnectionFactory){LettuceConnectionFactory c=(LettuceConnectionFactory)redisConnectionFactory;c.validateConnection();}}
}2.开启获取连接的校验
@Component
@Slf4j
public class LettuceConnectionValidConfig implements InitializingBean {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Overridepublic void afterPropertiesSet() throws Exception {if(redisConnectionFactory instanceof LettuceConnectionFactory){LettuceConnectionFactory c=(LettuceConnectionFactory)redisConnectionFactory;c.setValidateConnection(true);}}
}
Lettuce连接池超时问题简单记录相关推荐
- springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)
lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...
- springboot研究九:lettuce连接池很香,撸撸它的源代码
个人公众号:jinjunzhu 目录 springboot中lettuce配置 lettuce初始化 使用netty创建连接 管理连接 actuator健康检查获取连接 释放不掉的连接 共享连接 总结 ...
- HikariPool连接池超时问题
文章目录 HikariPool连接池超时 超时异常错误代码 可能原因 源码 解决策略之一 HikariPool连接池超时 超时异常错误代码 2020-04-07 10:42:43.443 [db_cr ...
- springboot集成lettuce连接池
获取连接时流程图: 第一次访问时:RedisTemplate.java @Nullablepublic <T> T execute(RedisCallback<T> actio ...
- [转].Net连接池超时注意事项
http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并 ...
- 连接池超时配置_HttpClient连接池的一些思考
前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...
- Lettuce连接池
Lettuce 连接被设计为线程安全,所以一个连接可以被多个线程共享,同时lettuce连接默认是自动重连.虽然连接池在大多数情况下是不必要的,但在某些用例中可能是有用的.lettuce提供通用的连接 ...
- node mysql 连接池 超时,关于NodeJS中mysql连接池卡死问题
最近在做毕设,遇到一个问题,就是当我多次请求数据库后就断开了数据库的连接.在网上找了很久答案,最后终于解决了.感谢大神,放上链接. 其实就是被连接池中的释放给坑了 代码中不应该用con.realeas ...
- KA,连接池居然这么简单?
<"ID串行化"保证群消息顺序性>提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节. 通常如何通过连接访问下游? 工程架构中有很多访问下游 ...
最新文章
- 让Windows 2000/XP系统自动登陆
- C# 如何遍历删除某个控件上的所有子控件
- 绩效考核及评估活动的实施步骤及疑难问题汇编
- 高清晰卫星图片:东京、法兰克福机场、华盛顿机场、金字塔、凯旋门
- qc中的流程图怎么画_超级详细的QC七大工具绘制方法,手把手教你做出漂亮图表...
- 小程序自定义下拉刷新
- 解决C:/WINDOWS/system32/aliedit/a找不到文件的错误提示
- 英语音标学习视频教程
- 神经网络如何识别图像,神经网络图像识别技术
- PostgreSQL的下载和安装使用步骤
- 对《java程序员上班那点事》笔者对数组占用内存质疑
- 基于android的线上教育app
- DSS 代码分析【启动、初始化流程】
- I \ Q信号、IFI \ IFQ信号、差分信号、单端信号知识总结
- 计算机毕业设计Java某日杂商店进销存管理系统设计(源码+系统+mysql数据库+lw文档)
- 动态规划-拔萝卜问题
- android对文件的MD5验证
- 计算机科学拒签概率高吗,美签拒签率较高的5类人!你上榜了吗?
- Word 高效办公,三步搞定活动策划书排版(快人半小时)
- IPv6 RA Guard
热门文章
- 2017年我国将开始部署和建设IPv6地址项目
- F28033之ADC
- Python 3.x教程:如何使用Python将图片转为漫画风格?
- Oracle 报ora 12541 12560
- win7关闭计算机控制器,win7电脑关机重启快捷键是什么
- [日语二级语法]日语能力测试二级语法详解 1
- springboot集成activiti汉化
- CC2530——lcd屏幕(ST7735S)
- 荣耀电脑微软服务器,荣耀与微软签署全球 PC 合作协议:Win10 成荣耀笔记本电脑官方操作系统...
- MegaCli使用手册