当前位置:   article > 正文

【Java Web】jdbc —— 使用C3P0数据库连接池报错java.lang.ClassNotFoundException_javaweb使用jdbc代码出现好多异常是怎么回事

javaweb使用jdbc代码出现好多异常是怎么回事

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



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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

  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。如下:
Alt
但是点击运行,程序却报上面的错,如下:
在这里插入图片描述

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




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 这个包再导入项目中,如下:
Alt
然后再次运行程序,便得到了如下正确输出:
在这里插入图片描述
程序输出了正确的日志,并打印了得到的连接对象信息。




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)



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/907877
推荐阅读
相关标签
  

闽ICP备14008679号