Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 400|回复: 0

数据库连接池之c3p0的配置 + 问题解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-24 17:48:19 | 显示全部楼层 |阅读模式

    关于c3p0连接池的配置与使用网上教程很多,但很多朋友在配置的时候出现了不少这样那样的问题,这里我就详细介绍怎么配置以及出现问题的解决方案!
    先下载c3p0的依赖包和数据库的驱动包:
    c3p0依赖包官网下载:https://sourceforge.net/projects/c3p0/
    数据库驱动包官网下载:https://dev.mysql.com/downloads/file/?id=479586
    1.把下载的c3p0依赖包的那个文件夹里面的src目录下的两个*.jar包拷贝到你的项目中,最好在项目中新建一个lib文件夹放在里面,方便管理。
    2.把下载的数据库驱动包文件夹里面的mysql-connector-java-8.0.12.jar也拷贝到你的项目中。
    3.注意!!!在官网下的时候最好下载最新的版本,因为一般兼容性比较好,否则在配置连接的时候会出问题。

    在项目的src目录下新建一个c3p0-config.xml文件,文件内容如下(这里以配置mysql为例):
    c3p0-config.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xml>
    <c3p0-config>

    <!--默认配置-->
    <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驱动包 -->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/atm</property> <!--数据库地址 -->
    <property name="user">root</property> <!--用户名 -->
    <property name="password">123456</property> <!--用户密码 -->
    </default-config>

    </c3p0-config>

     

     

     


    这里的设置为默认的配置 < default-config >,如果还想配置其他的数据库连接源的就要指定连接源的名称,比如:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xml>
    <c3p0-config>

    <!--默认配置-->
    <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驱动包 -->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/atm</property> <!--数据库地址 -->
    <property name="user">root</property> <!--用户名 -->
    <property name="password">root</property> <!--用户密码 -->
    </default-config>

    <!--指定连接源的配置-->
    <named-config name="mysql_2">
    <property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驱动包 -->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/user</property> <!--数据库地址 -->
    <property name="user">root</property> <!--用户名 -->
    <property name="password">root</property> <!--用户密码 -->
    </named-config>

    </c3p0-config>




    一般情况下不需要太大用途的话这样配置就行了,其参数都是默认的,如果有其他的需求,比如设置最大连接数,最长连接时间等,那就还要在配置文件中增加其他的属性以及设定该属性的值value,这里不再说明,有需要的自行百度查找就OK了!!!

    接下来就是编写数据库连接池的使用部分了,在src目录的某个包中新建一个*.java 文件,文件内容如下:
    DBUtils.java:
    package cn.com.bfec.utils;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import com.mchange.v2.c3p0.ComboPooledDataSource;

    public class DBUtils {
    static ComboPooledDataSource cpds = null;

    /*
    * 1.选择配置的连接池
    */
    static {
    cpds = new ComboPooledDataSource();
    }

    /*
    * 2.获得与数据库的连接
    */
    public static Connection getConnection() {
    try {
    return cpds.getConnection();
    }catch(SQLException e) {
    e.printStackTrace();
    return null;
    }
    }

    /*
    * 3.关闭与数据库的连接
    * !-->此关闭与数据库的连接不是真正把连接的数据库关闭,而是将对象放回数据库连接池中
    */
    public static void close(Connection conn,PreparedStatement pstm,ResultSet rs) {
    if(rs!=null) {
    try {
    rs.close();
    }catch(SQLException e) {
    e.printStackTrace();
    }
    }

    if(pstm!=null) {
    try {
    pstm.close();
    }catch(SQLException e) {
    e.printStackTrace();
    }
    }

    if(conn!=null) {
    try {
    conn.close();
    }catch(SQLException e) {
    e.printStackTrace();
    }
    }
    }

    }

     

     

     

     

    在编写这个类文件时,特别是用eclipse做Java Project项目开发的,提示ComboPoolDataSource cannot be resolve to a type! 然后那个import的包import com.mchange.v2.c3p0.ComboPooledDataSource;也出错,这是因为ComboPoolDataSource这个数据类型找不到关联依赖包的原因。此时只需要:选中ComboPoolDataSource , 按ctrl + 1 ,在弹出来的解决方案中双击一个叫建立(修复)关联的解决方案(一般是最后那个选项),再确认即可解决问题, 这时在项目结构中会多出一个Referenced Libraries文件夹就是用来存放关联文件的。
    4 . 右击 Referenced Libraries—>Build Path—>Configure Build Path—>Add JARS—>选择该项目中存放的数据库驱动包 mysql-connector-java-8.0.12.jar—>OK—>Apply and Close,这样就将数据库的驱动也建立了关联,此步骤很重要,如果没建立关联,数据库是连接不上的!!!

    5 . 最后编写一个测试类测试能否正常使用c3p0数据库连接池连上数据库:

    DBTest.java
    package cn.com.bfec.DB;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import cn.com.bfec.utils.DBUtils;

    public class DBTest {

    public static void main(String[] args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    conn = DBUtils.getConnection(); //调用工具类的getConnection()方法
    String sql = "select * from user"; //SQL语句

    if(conn!=null)
    System.out.println("哈哈,数据库连接成功啦");

    try {
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    while (rs.next()) {
    System.out.print(rs.getString("user_name") + " ");
    System.out.print(rs.getString("password_login") + " ");
    System.out.println();
    }

    conn.close();//并不是真的关闭,只是将连接放回连接池

    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    1
    至此,数据库连接池的配置与使用成功!

    常见问题及解决方案:

    如果配置什么的都没问题的情况下出现等待连接,连接超时的情况,那就要检查一下数据库服务是否启动
    如果出现:Unknown system variable ‘query_cache_size’,那就是数据库驱动包的问题,这时就需要下载更高版本的数据库驱动包。
    如果出现:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized... 的ERROR,那么就要在c3p0-config.xml修改连接的URL为:
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/atm?serverTimezone=GMT%2b8</property>

     

     

     


    如果出现会话失败: Communication Failure!,首先检查你的数据库服务是否启动,配置的username,password,url是否出错,特别注意数据库名写错的问题,如果还是不行的话,那么很大的问题就是上面说的数据库驱动包的问题了。
    如果出现了线程死锁的问题:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@513098 -- APPARENT DEADLOCK!! ,要么就是你在配置c3p0-config.xml时,配置的参数值,比如连接池的最大连接数太大(默认是100)等,这时你就要修改相应的参数值了。另一个原因就是上面所说的数据库驱动包有问题,导致连接不上,出现线程死锁。
    好了,大致常见的问题就这些。记住,很多问题都是数据库驱动包、c3p0依赖包、数据库服务没启动,配置的数据库连接路径出错的问题,沿着这几个思路去解决问题就行了。如果有其他问题,欢迎下方给我留言!

    ————————————————
    版权声明:本文为CSDN博主「AwayFuture」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/AwayFuture/article/details/82840406

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 09:14 , Processed in 0.069480 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表