getSessionFactory().openSession()导致druid连接池中的连接都占用满但无法回收

该问题产生的现象

页面刷新几次后,就卡住,线上就得需要重新部署(还好是测试环境,不是真正生产环境)

过程及原因

  1. 查看日志线程池满了
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60010, active 20, maxActive 20
                at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
                at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:280)
                ... 64 more
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60010, active 20, maxActive 20
                at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1071)
                at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:898)
                at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
  1. 原因

Mybatis中有一种不用写mapper和mapper.xml也可以和数据库连接的方法:通过使用 sqlSession执行拼接好的sql,直接运行,在创建连接时候(继承 SqlSessionDaoSupport)获取 sqlMapper,使用了 getSessionFactory().openSession(),配置中使用 druid连接池,导致一个现象就是,用到这个 sqlMapper的页面,只要刷新个几次就卡住了,导致每次不得不重启系统,如果是线上就得次次重新部署。

解决过程及办法

  1. 一开始先尝试,增加了druid的回收机制配置(properties配置文件,改为yml同理)
#druid recycle Druid的连接回收机制
#超过时间限制是否回收
spring.datasource.druid.removeAbandoned = true
#超时时间;单位为秒。180秒=3分钟
spring.datasource.druid.removeAbandonedTimeout = 180
#关闭abanded连接时输出错误日志
spring.datasource.druid.logAbandoned = true

通过这种办法,卡住了过一会再刷新就好了(也是概率问题,有的时候也会卡着),但这样也影响使用,未从根本解决问题

  1. 通过线程池总是达到最大值,判断是否是druid未回收之前的连接

经过debug,反复测试:原来是 getSessionFactory().openSession()的锅,所以改为了 SqlSessionDaoSupport.getSqlSession()这个方法,再通过 SqlMapper sqlMapper = new SqlMapper(getSqlSession())获取sqlMapper得以解决问题。

Original: https://www.cnblogs.com/intTom/p/16718243.html
Author: intTom
Title: getSessionFactory().openSession()导致druid连接池中的连接都占用满但无法回收

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584954/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MongoDB笔记(一)

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系…

    Java 2023年6月8日
    0115
  • JDK动态代理为什么必须要基于接口?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 前几天的时候,交流群里的小伙伴抛出了…

    Java 2023年6月5日
    0108
  • springboot 整合druid–Java 注解+代码配置 Bean

    1.pom.xml引入 2.druid配置类: 3.构建DataSource对象 4.配置监控拦截器 5.配置Druid监控视图 6.去除druid监控页面广告 7.启动类加@Se…

    Java 2023年6月6日
    0119
  • 归并排序(java实现)

    目录 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 一、概念及其介绍 归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是…

    Java 2023年6月5日
    0133
  • Object.keys() 作用

    能便利 Key Object.keys() posted @2022-08-31 16:04 简单易懂 阅读(7 ) 评论() 编辑 Original: https://www.c…

    Java 2023年6月5日
    0105
  • SDOI 2018二轮题解(除Day2T1)

    博主诈尸啦 虽然一轮之后就退役了但是二轮还是要去划划水呀~ 然鹅学了不到一个月文化课再回来看OI的东西有一种恍如隔世的感觉,烤前感觉也没啥可复习的,就补一补去年二轮的题吧。 题目思…

    Java 2023年5月30日
    069
  • Spring AOP 切点切面

    Spring AOP 切点切面 https://www.jianshu.com/p/94879042db88 https://www.jianshu.com/p/994027425…

    Java 2023年5月30日
    0101
  • 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识。虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言。在此并不讨论 JAVA .NET 的好坏,仅仅是…

    Java 2023年5月29日
    0105
  • Activemq消息持久化

    官方文档: http://activemq.apache.org/persistence.html ActiveMq持久化相关配置:/usr/local/apache-active…

    Java 2023年5月29日
    081
  • 对 wechat-dev 的吐槽

    我只能说这东西一套用下来体验非常不好 可是官方没有这种说明,多写几个字会死? 体验版不打开调试不允许发http请求,我服了。那你还提供调试面板,提供了个寂寞,也不说。 小程序 公众…

    Java 2023年6月7日
    076
  • volatile关键字理解

    volatile是一个轻量级的同步机制,相比传统的锁(如synchronized),在性能上面是有优势的,但是虚拟机对锁有过优化,所以很难确切的说volatile比synchron…

    Java 2023年6月5日
    0102
  • nginx用户认证配置( Basic HTTP authentication)

    ngx_http_auth_basic_module模块实现让访问着,只有输入正确的用户密码才允许访问web内容。web上的一些内容不想被其他人知道,但是又想让部分人看到。ngin…

    Java 2023年5月30日
    096
  • Tomcat报错:类XXXServlet不是Servlet 解决方法

    学习servlet 结果对应网页打不开,报错 HTTP状态 500 – 内部服务器错误类型 异常报告消息 类HelloServlet不是Servlet… 根…

    Java 2023年6月9日
    0151
  • 4、多态

    多态概念(一共三点满足就行) 1、 继承 2、程序运行时将子类对象赋值给父类 3、通过父类去调用子类的方法 一、父类类型做方法的参数 <span class=”kwd”&gt…

    Java 2023年6月6日
    0115
  • MyBatis(二)-CURD (ResultMap 一对一,一对多)

    1、insert 标签 1.1 获取SqlSessionFactory 对象的通用方法 方便后面分测试; //获取SqlSessionFactory 对象的通用方法 public …

    Java 2023年6月15日
    079
  • Java 线程创建与常用方法

    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、…

    Java 2023年6月9日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球