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


    该问题产生的现象

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

    过程及原因

    1. 查看日志线程池满了
    txt
    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同理)
    properties
    #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得以解决问题。


    __EOF__

  • 本文作者: intTom
  • 本文链接: https://www.cnblogs.com/intTom/p/16718243.html
  • 关于博主: 一位喜欢吃面食的程序员
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    [kafka]二.优化(如何保证不丢数据,且不重复[一次且仅一次])
    Base64结合密码学x509编码和PKCS#8编码
    21.3 CSS 背景属性
    成长杂志成长杂志社成长编辑部2022年第7期目录
    酷开系统走在前列,品牌重启增长,酷开科技成为品牌商合作目标
    互联网那些技术 | 高可用三大利器 — 熔断、限流和降级
    【数据库应用-2】——CDA
    【Educoder数据挖掘实训】插值填充法处理遗漏值
    SSM整合
    ES 全文搜索与数据分析引擎
  • 原文地址:https://www.cnblogs.com/intTom/p/16718243.html