记一次jedis连接池顽固问题排查与修改

这辈子不想再看到jedisBrokenPipe!!

 

测试环境运行16天后报错信息:

05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset] with root cause java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at java.net.SocketInputStream.read(SocketInputStream.java:127) at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196) at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:215) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340) at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:259) at redis.clients.jedis.Connection.getBulkReply(Connection.java:248) at redis.clients.jedis.Jedis.hget(Jedis.java:674) at com.chint.cdc.TenantAPI.getTenanatInfoWithNumberFromRedis(TenantAPI.java:224) at com.chint.cdc.TenantAPI.getInfoByNumber(TenantAPI.java:126) at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.getJedis(GeneralAuthorizationAspect.java:224) at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.around(GeneralAuthorizationAspect.java:131)

 

本地调试时,130并发的报错信息:

15:08:33.080 [http-nio-8093-exec-135] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Software caused connection abort: socket write error] with root cause
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:52)
at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:216)
at redis.clients.jedis.Connection.flush(Connection.java:331)
at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:257)
at redis.clients.jedis.Connection.getBulkReply(Connection.java:248)
at redis.clients.jedis.Jedis.hget(Jedis.java:674)
at com.chint.cdc.TenantAPI.getTenanatInfoWithNumberFromRedis(TenantAPI.java:224)
at com.chint.cdc.TenantAPI.getInfoByNumber(TenantAPI.java:126)
at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.getJedis(GeneralAuthorizationAspect.java:231)
at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.around(GeneralAuthorizationAspect.java:134)
at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

大佬一直说要记得释放连接,于是我改成以下写法:

记一次jedis连接池顽固问题排查与修改

但还是有问题,本地30并发没问题。130并发就跪了。怎么想怎么奇怪,明明都关闭连接了,为啥还会无法获取jedis连接,最后换了一种思路。不在当前切面类维护jedisPoolMap,而是用jedisConfig里的通用map,代码见下图:

记一次jedis连接池顽固问题排查与修改

 

最后扛住1000并发。10000会报错连接超时,但是后续请求会完全正常得到响应。

记一次jedis连接池顽固问题排查与修改

 因为本地性能受限,所以10s后报超时我觉得是正常的

15:56:42.773 [http-nio-8093-exec-450] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
java.util.NoSuchElementException: Timeout waiting for idle object, borrowMaxWaitDuration=PT10S
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:312)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223)
at redis.clients.util.Pool.getResource(Pool.java:49)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.getJedis(GeneralAuthorizationAspect.java:222)
at com.chint.cdc.app.maintenance.authorization.GeneralAuth.GeneralAuthorizationAspect.around(GeneralAuthorizationAspect.java:134)
at sun.reflect.GeneratedMethodAccessor107.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)

 

原文链接:https://www.cnblogs.com/geekheart/p/jedis2023.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:记一次jedis连接池顽固问题排查与修改 - Python技术站

(2)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • Java深入浅出理解快速排序以及优化方式

    Java深入浅出理解快速排序以及优化方式 快速排序简介 快速排序是一种常用的排序算法,它的基本思想是选定一个基准数,通过递归的方式将比基准数小的值放在其左侧,比基准数大的值放在其右侧,最终达到排序的效果。快速排序的时间复杂度为O(nlogn),是一种比较快速有效的排序算法。 快速排序基本流程 选择一个基准数,例如选定数组的最后一个元素作为基准数; 遍历数组,…

    Java 2023年5月19日
    00
  • Spring整合mybatis、springMVC总结

    这篇攻略主要介绍如何整合Spring、Mybatis和Spring MVC三个开源框架,让我们能够更轻松、更高效的构建Web应用程序。 简介 Spring是一个开源的JavaEE框架,用于开发企业级Web应用程序。Mybatis是一款轻量级的Java ORM框架,很适合与Spring集成。Spring MVC是Spring框架的一部分,用于构建Web应用程序…

    Java 2023年5月20日
    00
  • Mybatis模糊查询和动态sql语句的用法

    接下来我将详细讲解”Mybatis模糊查询和动态sql语句的用法”的完整攻略。 Mybatis模糊查询 模糊查询一般用于根据用户输入的关键字(搜索词)模糊匹配查询数据库中的数据。在Mybatis中,可以使用LIKE关键字实现模糊查询。 下面是一条简单的Mybatis模糊查询的代码示例: <select id="findUserByName&q…

    Java 2023年5月20日
    00
  • Spring security BCryptPasswordEncoder密码验证原理详解

    Spring Security BCryptPasswordEncoder密码验证原理详解 密码加密和验证是系统设计中非常重要的一部分,因为用户密码往往是非常重要且敏感的信息。为了保护用户的密码不被恶意窃取和使用,我们需要对密码进行加密和验证。 Spring Security提供了强大的密码加密和验证机制,其中 BCryptPasswordEncoder 是…

    Java 2023年5月20日
    00
  • SpringMVC拦截器运行原理及配置详解

    下面我就来详细讲解一下“SpringMVC拦截器运行原理及配置详解”。我们先从原理讲起。 SpringMVC拦截器运行原理 SpringMVC拦截器是一个非常重要的概念,它在SpringMVC框架的基础上进行了一定的封装,可以对请求进行拦截和处理。在SpringMVC中,可以通过实现拦截器接口,来实现自己的拦截器。 SpringMVC拦截器在处理流程中的位置…

    Java 2023年5月16日
    00
  • Java大文件上传详解及实例代码

    Java大文件上传详解及实例代码 介绍 Java大文件上传是web开发中比较基础的功能,常用于图片、视频等大文件的上传。基于HTTP协议的限制,一般的文件上传有大小限制,一般为1M,甚至更小。本篇文章将介绍如何使用Java实现大文件上传,并提供示例代码。 实现方案 为了实现大文件上传功能,我们可以采用分片上传的策略,将大文件切分成多个片段进行上传。具体的实现…

    Java 2023年5月20日
    00
  • 详解SpringBoot中的统一异常处理

    下面我将为你详细讲解“详解SpringBoot中的统一异常处理”的完整攻略。 什么是SpringBoot中的统一异常处理 在SpringBoot中,我们经常需要对抛出的异常进行统一处理。如果我们每个地方都去捕捉异常,并进行相应处理,那么代码量会非常大。此时,我们可以使用SpringBoot中的统一异常处理,将所有异常集中处理,大大减少了代码量,也方便了我们对…

    Java 2023年5月27日
    00
  • JSP实现文件上传功能

    下面就是使用JSP实现文件上传功能的攻略。 1. 前置准备 在进行文件上传的操作时,需要使用到Web容器提供的Servlet API和一些第三方的类库,所以在开始实现前,需要进行一些前置准备。 1.1. 导入第三方类库 上传文件过程中,需要用到Apache的常用文件上传组件commons-fileupload,所以需要下载并导入到项目中。在项目中创建一个名叫…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部