使用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连接池超时问题简单记录相关推荐

  1. springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)

    lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...

  2. springboot研究九:lettuce连接池很香,撸撸它的源代码

    个人公众号:jinjunzhu 目录 springboot中lettuce配置 lettuce初始化 使用netty创建连接 管理连接 actuator健康检查获取连接 释放不掉的连接 共享连接 总结 ...

  3. HikariPool连接池超时问题

    文章目录 HikariPool连接池超时 超时异常错误代码 可能原因 源码 解决策略之一 HikariPool连接池超时 超时异常错误代码 2020-04-07 10:42:43.443 [db_cr ...

  4. springboot集成lettuce连接池

    获取连接时流程图: 第一次访问时:RedisTemplate.java @Nullablepublic <T> T execute(RedisCallback<T> actio ...

  5. [转].Net连接池超时注意事项

    http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并 ...

  6. 连接池超时配置_HttpClient连接池的一些思考

    前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...

  7. Lettuce连接池

    Lettuce 连接被设计为线程安全,所以一个连接可以被多个线程共享,同时lettuce连接默认是自动重连.虽然连接池在大多数情况下是不必要的,但在某些用例中可能是有用的.lettuce提供通用的连接 ...

  8. node mysql 连接池 超时,关于NodeJS中mysql连接池卡死问题

    最近在做毕设,遇到一个问题,就是当我多次请求数据库后就断开了数据库的连接.在网上找了很久答案,最后终于解决了.感谢大神,放上链接. 其实就是被连接池中的释放给坑了 代码中不应该用con.realeas ...

  9. KA,连接池居然这么简单?

    <"ID串行化"保证群消息顺序性>提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节. 通常如何通过连接访问下游? 工程架构中有很多访问下游 ...

最新文章

  1. 让Windows 2000/XP系统自动登陆
  2. C# 如何遍历删除某个控件上的所有子控件
  3. 绩效考核及评估活动的实施步骤及疑难问题汇编
  4. 高清晰卫星图片:东京、法兰克福机场、华盛顿机场、金字塔、凯旋门
  5. qc中的流程图怎么画_超级详细的QC七大工具绘制方法,手把手教你做出漂亮图表...
  6. 小程序自定义下拉刷新
  7. 解决C:/WINDOWS/system32/aliedit/a找不到文件的错误提示
  8. 英语音标学习视频教程
  9. 神经网络如何识别图像,神经网络图像识别技术
  10. PostgreSQL的下载和安装使用步骤
  11. 对《java程序员上班那点事》笔者对数组占用内存质疑
  12. 基于android的线上教育app
  13. DSS 代码分析【启动、初始化流程】
  14. I \ Q信号、IFI \ IFQ信号、差分信号、单端信号知识总结
  15. 计算机毕业设计Java某日杂商店进销存管理系统设计(源码+系统+mysql数据库+lw文档)
  16. 动态规划-拔萝卜问题
  17. android对文件的MD5验证
  18. 计算机科学拒签概率高吗,美签拒签率较高的5类人!你上榜了吗?
  19. Word 高效办公,三步搞定活动策划书排版(快人半小时)
  20. IPv6 RA Guard

热门文章

  1. 2017年我国将开始部署和建设IPv6地址项目
  2. F28033之ADC
  3. Python 3.x教程:如何使用Python将图片转为漫画风格?
  4. Oracle 报ora 12541 12560
  5. win7关闭计算机控制器,win7电脑关机重启快捷键是什么
  6. [日语二级语法]日语能力测试二级语法详解 1
  7. springboot集成activiti汉化
  8. CC2530——lcd屏幕(ST7735S)
  9. 荣耀电脑微软服务器,荣耀与微软签署全球 PC 合作协议:Win10 成荣耀笔记本电脑官方操作系统...
  10. MegaCli使用手册