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)

大家都在看

  • main 方法可以继承吗?

    阿里二面:main 方法可以继承吗? 昨天,微信群里一位网友,在群里发了自己面试阿里的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是: Java &#x4E…

    Java 2023年6月7日
    094
  • 函数式数据结构-列表

    在开始之前我们先了解几个名词: 1、什么是函数式编程:函数式编程属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用,可以说是面向过程…

    Java 2023年6月9日
    075
  • 根据map的value进行排序

    1、将Map放入List中 List> entryList = new ArrayList(result Map.entrySet()); 2、利用Collections的s…

    Java 2023年6月5日
    085
  • Error:(5, 25) java: 程序包javax.servlet.jsp不存在

    1.首先选择file 2.再选择file目录下的Project Structure 3.选择Modules这个选项,再选择到你的项目中,点击绿色的”+”号 …

    Java 2023年5月29日
    064
  • java list遍历添加元素_【转】:java遍历List时动态添加和删除元素

    遍历元素最常见的三种方法: // 1.最普通的一种方式 for(int i = 0;i < size;i++) //2.for each方式 for(BEAN b: BEAN…

    Java 2023年5月29日
    071
  • 一冲计划

    计划总会过期,实现了的才会永久保存 Well Plan 顺利通过我的第一学期的所有科目,可以熟练的操作计算机一级,并将计算机二级提上日程,不打算考一级计算机,想要直接考二级!趁着假…

    Java 2023年6月5日
    079
  • 【LEETCODE】76、面试题 08.11. 硬币

    package dynamicprogramming.medium; /** * @Auther: xiaof * @Date: 2020/4/23 09:17 * @Descri…

    Java 2023年6月5日
    078
  • 三分钟入门

    网络编程(通俗易懂) tcp通信:打电话,对方接,接了,通话,互通性 udp通信:发短信,发完就完事 通信作用:无非就是传播交流信息,进行数据交换 实现网络通信: IP 端口 规则…

    Java 2023年6月6日
    066
  • [Java编程思想] 第四章 控制执行流程

    4.1 true和false Java不允许将一个数字作为布尔值使用。 4.2 迭代 while、do-while和for控制着循环,有时将其划分为”迭代语句&#822…

    Java 2023年6月5日
    098
  • Spring 5 源码解析- XML中Bean配置加载-3

    spring-framework 加载配置文件过程: 根据业务系统运行的环境,选择 ApplicationContext 接口合适的实现类,启动系统先初始化上下文环境,然后通过Be…

    Java 2023年6月6日
    075
  • 设计模式之代理模式(Proxy Pattern)

    1.1、介绍 代理模式(Proxy Pattern)给某一个对象提供一个代理,并由代理对象控制原对象的引用。代理对象在客户端和目标对象之间起到中介作用 。 代理模式是常用的结构型设…

    Java 2023年6月7日
    077
  • 【Java学习】Java 初始化List的5种方式

    Java初始化List的5种方法 第一种 /** * 第一种方式 * 常规方式 */ @Test public void one(){ List languages = new A…

    Java 2023年5月29日
    098
  • 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)

    TableGo_20191026 v6.6.6 正式发布,此次版本更新如下:1、新增通过自定义模板生成Word文档的功能,可以使用FreeMarker模板生成自定义格式的数据库文档…

    Java 2023年6月9日
    095
  • 最近学习了JDK SPI

    JDK SPI是什么 最近工作中听几个同事说了好几次SPI这个名词,虽然和我没关系,但是心里默默想还是学习一下,不然下次和我说到SPI,连是什么都不知道那就尴尬了。 所以SPI是什…

    Java 2023年5月30日
    083
  • Mybatis(解决属性名和字段名不一致的问题)

    5、Mybatis(解决属性名和字段名不一致的问题) 我们从数据库中取到的数据都会交给实体类,然后从实体类中拿到数据并操作数据,所以如果我们数据库中的字段要是和实体类中的属性不一致…

    Java 2023年6月13日
    051
  • 一文看懂JVM内存区域分布与作用

    那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看。 须知,本文是根据JDK8来介绍的。 程序计数器 首先它是线程私有的,它也称为…

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