栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HikariPool-1 - Connection is not available, request timed out after 30001ms.链接池链接数据库超时

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HikariPool-1 - Connection is not available, request timed out after 30001ms.链接池链接数据库超时

项目场景:

提示:这里简述项目相关背景:

项目场景:Springboot框架,hibernate框架,mysql数据库,hikari连接池


问题描述

项目部署到生产环境启动20分钟左右就会报错,报链接池链接数据库超时;
HikariPool-1 - Connection is not available, request timed out after 30001ms.

dao代码展示: 这是一种比较老并且恶心的sql写法,也是第一次接触这种框架
      @Override
public List selectContractList( String parentId) {
    StringBuffer sql = new StringBuffer();
    sql.append("SELECT * FROM ( select null AS id, a.contract_id as contractIdn" +
        "      ,a.contract_code as contractCoden" +
        "      ,a.project_name as projectNamen" +
        "      ,a.parent_contract_id as parentContractIdn" +
        "      ,a.customer_name as customerNamen" +
        "      ,a.device_name as deviceNamen" +
        "      ,a.contract_type as contractTypen" +
        "      ,a.create_user as createUsern" +
        "      ,a.create_user_name as createUserNamen" +
        "      ,a.flow_process_id as flowProcessId  n" +
        "      ,a.contract_title as contractTitlen" +
        "      ,a.verify_status as verifyStatusn" +
        "      ,a.create_time as createTimen" +
        "      ,a.execute_status as executeStatus  n" +
        "      ,if(isnull(t.subNumber),'0','1') AS subExecuteStatusn" +
        "     ,'0' AS appType,a.del_flag AS delFlag,a.tenant_id AS tenantId,a.business_type AS businessType,a.customer_credit_code AS customerCreditCode,a.project_id as projectIdn" +
        "  from b_contract_apply an" +
        "  left join (n" +
        "select parent_contract_id,count(*) AS subNumbern" +
        "from b_contract_apply bca n" +
        "where bca.parent_contract_id IS NOT NULL n" +
        "and bca.execute_status = 0 n" +
        "GROUP BY bca.parent_contract_id HAVINg COUNT(*) > 0 n" +
        "  ) t on t.parent_contract_id = a.contract_id n");
    sql.append(" UNIOn ALL " +
        "SELECt                                     n" +
        "  bccf.id AS id,                          n" +
        "  bccf.contract_id AS contractId,         n" +
        "  bccf.contract_code AS contractCode,     n" +
        "  bccf.project_name AS projectName,       n" +
        "  '' AS parentContractId,                 n" +
        "  bccf.customer_name AS customerName,     n" +
        "  bccf.device_name AS deviceName,         n" +
        "  bccf.contract_type AS contractType,     n" +
        "  bccf.create_user AS createUser,         n" +
        "  bccf.flow_process_id as flowProcessId,  n" +
        "  bccf.create_user_name AS createUserName,n" +
        "  bccf.contract_name AS contractTitle,    n" +
        "  bccf.verify_status AS verifyStatus,     n" +
        "  bccf.create_time AS createTime,         n" +
        "  bccf.execute_status AS executeStatus,   n" +
        "  '' AS subExecuteStatus,                 n" +
        "  '1' AS appType,                         n" +
        "  bccf.del_flag AS delFlag,               n" +
        "  bccf.tenant_id AS tenantId,                         n" +
        "  '' AS businessType,bccf.customer_file_name AS customerCreditCode,'' AS projectId          n" +
        " FROM b_contract_change_flow bccf ) ai     n" +
        " where ai.delFlag = 0 ");
    if (!StringUtils.isEmpty(parentId)){
        sql.append("and ai.parentContractId = '").append(parentId).append("'");
    }else {
        sql.append(" and ai.verifyStatus = 1 and ai.executeStatus = 0");
    }
    Query query = entityManager.createNativeQuery(sql.toString());
    List list = query.unwrap(NativeQuery.class).setResultTransformer(new FluentHibernateResultTransformer(BContractApplyListVO.class)).list();
    EntityManagerFactoryUtils.closeEntityManager(this.entityManager);
    return list;
}

原因分析:

问题的原因报错是说的连接池链接不上数据库,从而导致系统崩溃,这个微服务所有的功能都不能够正常运行.


这个项目有非常多的定时任务
一直想着是不是定时任务太多,链接池数量太少,没有自动提交链接的配置呢?

与是就百度各种查找修改链接池配置的问题; 但是测试后发现结果并不解人意, 但是发现由原来20分钟报错延迟到了2小时之后.就觉得有点作用.然后又把定时任务由3分钟一次改到10分钟一次. 报错时间又延长到8小时

这个解决办法就是治标不治本!

解决方案:

@Transactional:事物注解

看到这里很多同学就会问?这个跟事物有啥关系呢.

那确实就是有关系,这种操作数据库的JPA可以说是非常的老的,它不像现在的mybatis,mybatis-Plus.这些框架底层都是会在对表进行增删改查之后都是会提交资源,断开链接的.

细心的同学看dao帖出来的代码就能看到,这个有EntityManagerFactoryUtils.closeEntityManager(this.entityManager) 去关闭链接呀! 因为是SpringBoot的框架,这个关闭链接是没有用的!我们需要用事物,去帮我们提交

这个问题也是上到生产,看到领导被客户叼.自己也是被领导一顿好叼啊. 但是呢挨叼也是工作的一部分呀! 自己太菜了!

努力学习!加油....一起做人上人
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/876858.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号