首页 > 编程语言 >druid连接池TestOnBorrow=true导致的程序启动失败

druid连接池TestOnBorrow=true导致的程序启动失败

时间:2023-09-18 14:55:38浏览次数:40  
标签:TestOnBorrow com connectionImpl druid dataSource mysql true class

现象:修改druid配置,启动application类,程序无法启动一直加载中,无法注册到Eureka。
mysql版本:8.0.15
配置:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

依赖:

com.alibaba:druid:1.1.10
compile files('lib/mysql-connector-java-8.0.15.jar')
runtime('mysql:mysql-connector-java')

最终问题入口:

com.alibaba.druid.util.MySqlUtils#getLastPacketReceivedTimeMs

正式开始调试,第一步代码 setTestOnBorrow(true)

    @Bean
    @Primary
    @Qualifier("dataSource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));// 用户名
        dataSource.setPassword(env.getProperty("spring.datasource.password"));// 密码
        dataSource.setInitialSize(1);
        dataSource.setMaxActive(20);
        dataSource.setMinIdle(5);
        dataSource.setMaxWait(30000);
        dataSource.setValidationQuery("select user()");
        dataSource.setTestOnBorrow(true);
        dataSource.setTestWhileIdle(true);
        dataSource.setPoolPreparedStatements(false);
        return dataSource;
    }

入口:

com.alibaba.druid.pool.DruidDataSource#getConnection(long)

    public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
        init();

        if (filters.size() > 0) {
            FilterChainImpl filterChain = new FilterChainImpl(this);
            return filterChain.dataSource_connect(this, maxWaitMillis);
        } else {
            return getConnectionDirect(maxWaitMillis);
        }
    }

代码入口getConnectionDirect(maxWaitMillis)
跟进去这段一段代码 testConnectionInternal(poolableConnection.holder, poolableConnection.conn)

 if (testOnBorrow) {
     boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
     if (!validate) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("skip not validate connection.");
         }

         discardConnection(poolableConnection.holder);
         continue;
     }
 }

继续找下去 MySqlUtils.getLastPacketReceivedTimeMs(conn)

if (valid && isMySql) {
    long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
    if (lastPacketReceivedTimeMs > 0) {
        long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs;
        if (lastPacketReceivedTimeMs > 0 ... ...
    }
}

问题就出现在这:Utils.loadClass("com.mysql.jdbc.MySQLConnection");

if (class_connectionImpl == null && !class_connectionImpl_Error) {
    try {
        class_connectionImpl = Utils.loadClass("com.mysql.jdbc.MySQLConnection");
    } catch (Throwable error) {
        class_connectionImpl_Error = true;
    }
}

也就是说当前1.1.10不支持新的数据库驱动,
导致下面的代码Object connImpl = conn.unwrap(class_connectionImpl);由于驱动版本不一致解包失败
报错:"java.sql.SQLException: Unable to unwrap to interface com.mysal.jdbc.MySQLConnection'
升级druid到1.1.24后发现代码还是报错
此时1.1.24源码已经更新为:


        if (class_connectionImpl == null && !class_connectionImpl_Error) {
            try {
                class_connectionImpl = Utils.loadClass("com.mysql.jdbc.MySQLConnection");
                if (class_connectionImpl == null) {
                    class_connectionImpl = Utils.loadClass("com.mysql.cj.MysqlConnection");
                    if (class_connectionImpl != null) {
                        mysqlJdbcVersion6 = true;
                    }
                }
            } catch (Throwable error) {
                class_connectionImpl_Error = true;
            }
        }

调试发现class_connectionImpl = Utils.loadClass("com.mysql.jdbc.MySQLConnection");不为空
排查依赖项发现:runtime('mysql:mysql-connector-java')
这个配置导致因为没有指定具体的版本号导致项目默认依赖了mysql-connector-java:5.1.40
注释后解决,代码走正常想要用的驱动:

class_connectionImpl = Utils.loadClass("com.mysql.cj.MysqlConnection");

标签:TestOnBorrow,com,connectionImpl,druid,dataSource,mysql,true,class
From: https://www.cnblogs.com/tomoto/p/17711848.html

相关文章

  • 无涯教程-JavaScript - TRUE函数
    描述TRUE函数返回逻辑值TRUE。YoucanusethisfunctionwhenyouwanttoreturnthevalueTRUEbasedonacondition.Example=IF(A1=1,TRUE()).YoucanalsoenterthevalueTRUEdirectlyintocellsandformulaswithoutusingthisfunction.Example=IF(A1=1,T......
  • 项目开发中难点-项目使用v-if控制表单/元素/组件显示隐藏,例如调用接口后赋值需重新加
    项目中使用v-if="show"  控制组件的显示或隐藏,当接口返回后this.show=false,进行赋值,后this.show=true显示 。但是页面没有正常显示,此时使用this.$nextTick。 一、$nextTick()概述1.$nextTick()原理$nextTick()是Vue.js框架中的一个方法,它主要用于DOM操作......
  • xv6 进程切换中的锁:MIT6.s081/6.828 lectrue12:Coordination 以及 Lab6 Thread 心得
    引言这节课和上一节xv6进程切换是一个完整的的进程切换专题,上一节主要讨论进程切换过程中的细节,而这一节主要讨论进程切换过程中锁的使用,所以本节的两大关键词就是"Coordination"(协调)和"lostwakeup"Coordination就是有关出让CPU,直到等待的事件发生再恢复执行。人们发明了很......
  • 踩坑DruidDataSource导致的服务频繁重启
    1.故障简述8月30日上午9:30发现某核心服务开始告警,主动重启,影响线上成交和查看订单。持续影响3分钟2.故障引入与处理的整个过程时间故障处理行动2023-08-3009:29:57收到监控告警某核心服务自动完成重启2023-08-3009:30:33服务全部启动完成2023-08-3009:51:00排查原因——通过......
  • 实现读写分离SpringBoot+MyBatis+Druid
    实现读写分离SpringBoot+MyBatis+Druid1.读写分离概念理解读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程......
  • 数据库连接池Druid使用方法
    数据库连接池Druid使用方法一、Druid连接池使用代码示例importcom.alibaba.druid.pool.DruidAbstractDataSource;importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.pool.DruidDataSourceFactory;importorg.junit.Test;importjavax.sql.DataSource;......
  • 实现数据库连接池druid的工具类
    一、数据库连接迟druid工具类importcom.alibaba.druid.pool.DruidDataSourceFactory;importorg.apache.commons.beanutils.PropertyUtils;importjavax.sql.DataSource;importjava.io.IOException;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;......
  • 虹科产品|HK-TrueNAS开放式存储平台被评为数字公益产品
    HK-TrueNAS被评为数字公益产品数字公共产品联盟(DigitalPublicGoodsAlliance)是一项多方利益相关者倡议,旨在促进数字公益(DPG)的发现、开发、使用和投资。数字公共产品的定义是所有人都能免费获取的资源或服务,它能为个人和整个社会带来至关重要的利益。数字公益的例子包括开源软件......
  • 弹性数据库连接池探活策略调研(二)——Druid | 京东云技术团队
    前言在上一篇文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——Druid,并为您介绍如何在使用Druid时实现最佳实践的弹性数据库连接池探活策略。DruidDruid的版本迭代更新比较快,同时探活配置的......
  • python3.6使用wordcloud 1.9报错ValueError: Only supported for TrueType fonts
    该版本的wordcloud的源码中显示不兼容python3.6 解决办法:修改wordcloud源码修改前508:box_size=draw.textbox((0,0),word,font=transposed_font,anchor="lt")510:result=occupancy.sample_position(box_size[3]+self.margin,......