使用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 .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();
}
}
}上述代码的意思很简单,流程如下:
- 使用c3p0中的ComboPooledDataSource对象来创建一个数据库连接池;
- 设置连接数据库的url , user , password;
- 获取连接对象并输出
我也提前在项目中导入了用于连接数据库(mysql 8.0.20)的对应版本jar包:mysql-connector-java-8.0.20,以及用于完成对 java 官方提供的数据库连接池的第三方 jar 包(截至2020-2-27的最新版本):c3p0-0.9.5.5.jar。如下:

但是点击运行,程序却报上面的错,如下:

这个问题让我百思不得其解,因为以前都没出现这问题呀。
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 这个包再导入项目中,如下:

然后再次运行程序,便得到了如下正确输出:

程序输出了正确的日志,并打印了得到的连接对象信息。
4.下载连接
下面,我将上述用到的3个 jar 包(截至2020-5-27最新,数据库是mysql 8.0.20)全部打包进压缩包 c3p0-all(version-2020-5-27) 中,供需要的同志们下载使用:
- 红尘过客们可在百度网盘中免费下载:百度网盘下载链接:json-lib-all(version-2020-5-25.zip)(提取码是:svlo)
















