【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException

使用C3P0数据库连接池报错java.lang.ClassNotFoundException


文章目录

      • 1.问题引入
      • 2.问题分析
      • 3.问题解决
      • 4.下载连接


1.问题引入

今天在使用数据库连接池(C3P0)连接数据库时,总是连接不上数据库,并且会报以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
	at com.zed.test.DataSourceTest.main(DataSourceTest.java:13)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more

报错的代码如下:

package com.zed.test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

public class DataSourceTest {
    public static void main(String[] args) {
        try{
            //创建C3P0(数据库连接池)
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            System.out.println("创建连接池成功1");
            //加载驱动
            dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
            //设置链接(注意设置编码)
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/demodb?useUnicode=true&characterEncoding=UTF-8");
            //设置用户名
            dataSource.setUser("root");
            //设置密码
            dataSource.setPassword("123456");
            //获取连接对象
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
        }catch (PropertyVetoException e){
            e.printStackTrace();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

上述代码的意思很简单,流程如下:

  1. 使用c3p0中的ComboPooledDataSource对象来创建一个数据库连接池;
  2. 设置连接数据库的url , user , password;
  3. 获取连接对象并输出

我也提前在项目中导入了用于连接数据库(mysql 8.0.20)的对应版本jar包:mysql-connector-java-8.0.20,以及用于完成对 java 官方提供的数据库连接池的第三方 jar 包(截至2020-2-27的最新版本):c3p0-0.9.5.5.jar。如下:
【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException_第1张图片
但是点击运行,程序却报上面的错,如下:
【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException_第2张图片

这个问题让我百思不得其解,因为以前都没出现这问题呀。




2.问题分析

后来在网上查阅大量的资料,发现在 c3p0-0.9.2 版本后,需再导入数据库连接池的辅助包 mchange-commons-java-xxx.jar 才能正常地使用。而我在项目中用的是最新的 c3p0-0.9.5.5.jar 包,因此必须导入对应的辅助包才能使用。
于是现在的问题是,什么版本的 mchange-commons-java-xxx.jar 包才能和这个最新版本匹配的 c3p0-0.9.2.jar 呢?通常我们认为,软件都是向下兼容的,反正你找发行时间大于等于 c3p0-0.9.5.5 这个版本的(2019年12月)就可以了。于是我就找到了同是当前最新的(2020年1月)发行版: mchange-commons-java-0.2.20.jar。




3.问题解决

接下来,当我们将 mchange-commons-java-0.2.20.jar 这个包再导入项目中,如下:
【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException_第3张图片
然后再次运行程序,便得到了如下正确输出:
【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException_第4张图片
程序输出了正确的日志,并打印了得到的连接对象信息。




4.下载连接

下面,我将上述用到的3个 jar 包(截至2020-5-27最新,数据库是mysql 8.0.20)全部打包进压缩包 c3p0-all(version-2020-5-27) 中,供需要的同志们下载使用:

  1. 有钱的大爷可用1C币在CSDN里下载:有钱的大爷可用1C币在CSDN里下载:c3p0-all(version-2020-5-27).zip
  2. 红尘过客们可在百度网盘中免费下载:百度网盘下载链接:json-lib-all(version-2020-5-25.zip)(提取码是:svlo)



你可能感兴趣的:(Java,Web,学习之路)