Java使用Druid数据库连接池获取Mysql常见的错误--不兼容问题

本文讲述了作者在使用Druid数据库连接池时遇到的问题,涉及Mysql版本与mysql-connector-java版本不一致,解决过程包括调整URL参数、升级库文件及确保Druid与Mysql版本匹配,最终成功连接数据库。

今天打算用Java从数据库连接池中获取连接时,遇到了一些问题,记录一下
我用的是阿里的Druid数据库连接池的jar包,下面是我的jdbc配置文件内容

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/tsingby  //我的数据库是tsingby
username=root		//账号密码
password=root
initialSize=5
maxActive=10
maxWait=3000

下面的是准备配置Jdbc工具类的代码

public class JdbcUtils {
    private static DruidDataSource dataSource;
    static {
        try {
            Properties properties=new Properties();
//            读取jdbc.properties属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//            从流中加载数据
            properties.load(inputStream);
            //创建了数据库连接池
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            //如果能从数据库连接池获取连接,就打印出来
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//测试静态代码块,是否正确运行
    }

}

运行后报了MySQLNonTransientConnectionException的错误。然后我试一试不用数据库连接池获取连接是否也会报同样的错误
测试代码:

package com.guigu.test;
import java.sql.*;

public class mysql {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        try
        {
            Class.forName("com.mysql.jdbc.Driver");// 加载驱动程序
            conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/tsingby","root","root");
            System.out.println("connection success!");//输出connection success表示数据库已成功连接
            conn.close();
        }
        catch(Exception e)
        {
            System.out.println("");
        }
    }
}

运行后发生以下错误

未能正常连接到数据库
Exception in thread "main" java.lang.NullPointerException
	at com.guigu.test.mysql.main(mysql.java:18)

后来百度搜索发现原来是Mysql版本和mysql-connector-java版本不一致造成的。
查询Mysql版本号:

SELECT version();
version()
8.0.23

然后去官网找对应版本mysql-connector-java
下载解压后就能找到对应的mysql-connector-java-8.0.11.jar将这个jar包拖金IDEA,右键点击它,然后选择add as a library

再次运行测试文件,发现还是抛出了NullPointerException异常:

Establishing SSL connection without server’s identity verification is
not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+
requirements SSL connection must be established by default if explicit
option isn’t set. For compliance with existing applications not using
SSL the verifyServerCertificate property is set to ‘false’. You need
either to explicitly disable SSL by setting useSSL=false, or set
useSSL=true and provide truststore for server certificate
verification.

大概意思就是,不建议在没有服务器身份验证的情况下建立SSL连接,此时我们需要在url后面加两个个参数useSSL=false,用与数据库的url隔开,两个参数之间用&隔开
如:jdbc:mysql://localhost:3306/tsingby?useSSL=false&serverTimezone=UTC
(jdbc.properties配置文件中的url也改成上面的)
之后我们再次运行mysql.java文件,发现已经可以正常连接到数据库。

回到Jdbc工具类JdbcUtils.java,并运行,发现还是不能从数据库连接池里获取到连接。抛出了空指针异常,并警告:Cannot resolve com.mysq.jdbc.Connection.ping method. Will use 'SELECT 1' instead.
百度查了一下,说可能是Mysql与Druid版本不一致造成的,
我们去下载最新版的Druid 也可以点击这里下载

加载.jar文件,同样的,将这个文件拖到IDEA,并右键点击—>

add as a library

为了方便看,再次写一下JdbcUtils.java,重新运行Jdbc工具类,

package com.guigu.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;

public class JdbcUtils {
    private static DruidDataSource dataSource;
    static {
        try {
            Properties properties=new Properties();
//            读取jdbc.properties属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//            从流中加载数据
            properties.load(inputStream);
            //创建了数据库连接池
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

    }

}

运行结果:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
522, 2021 6:51:49 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@670002

发现终于成功了!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科妙知行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值