资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

C3P0的使用

Java 更新时间: 发布时间: 计算机考试归档 最新发布

C3P0的使用

C3P0的使用

  • 一、什么是C3P0连接池
  • 二、使用C3P0(数据库连接池)的必要性
  • 三、数据库连接池的详细说明
  • 四、C3P0实操
    • 1.导入jar包
    • 2.配置xml文件
    • 3.c3p0-config.xml模板
    • 4.创建JDBCUtil类
  • 总结

一、什么是C3P0连接池

开源的JDBC连接池,C3P0连接池是在程序操作数据库之前预先根据配置文件创建一定数量的连接,当线程需要时直接取走,缩短了创建连接的时间,当使用完毕后,释放连接后放回连接池,以此类推,如果连接池中的连接使用完后,程序会根据配置文件配置的数据再次创建一批,使用完后放回连接池,并不是真正的关闭连接。

二、使用C3P0(数据库连接池)的必要性

当我们在进行基于数据库的web程序开发时,我们可以先在主程序(如Servlet、Bean)中通过JDBC中的DriverManager建立数据库连接,然后将要对数据库进行操作的sql语句封装到Statement中,最后在返回结果集后断开数据库连接。以上是较为传统的开发模式,然而用这种模式开发会埋下严重的安全隐患

三、数据库连接池的详细说明

数据库连接池的基本原理就是为数据库建立一个缓冲池。在缓冲池中先创建指定数量的数据库连接,当有连接请求时就从缓冲池中取出处于“空闲”状态的连接,并将此连接标记为“忙碌”,直到该请求进程结束后,它所使用的连接才会重新回到“空闲”状态,并等待下一次请求调用。

数据库连接池的主要作用就是负责分配、管理和释放数据库连接,它允许程序重复使用同一个现有的数据库连接,大大缩短了运行时间,提高了执行效率。

这里需要强调一点的是,数据库连接池中的连接数是在其初始化时根据c3p0-config.xml中的最小连接数来确定的。当然,无论连接池的连接数是否有被使用,它都至少会保持最小连接数,如果请求连接数超过最小连接数也会根据c3p0-config.xml中指定的自增长数增加连接数直到达到最大连接数,这时如果请求连接数量还是大于连接池中的连接数的话,剩下的请求将会被放入等待队列直到有空闲连接出现。

这样一来,数据库连接池相较于传统JDBC模式等到请求发出才创建连接的做法有着显而易见的优势。

四、C3P0实操

1.导入jar包

项目下创建一个lib目录,选择jar右击选择Add as Library

2.配置xml文件


配置文件要求:
(1) 文件名称:必须叫c3p0-config.xml
(2) 文件位置:必须在src下

3.c3p0-config.xml模板

	            com.mysql.jdbc.Driver        jdbc:mysql://localhost:3306/test01?useSSL=false        root        root                10                30                100                10        200                    com.mysql.jdbc.Driver        jdbc:mysql://localhost:3306/test01?useSSL=false        root        root        10        30        100        10        200                            

4.创建JDBCUtil类

public class JdbcUtil {    // 创建c3p0连接池对象    private static ComboPooledDataSource poll = new ComboPooledDataSource("mysql");    // 提供线程局部变量,每个线程(通过其get或set方法)都有自己独立初始化的变量副本    // ThreadLocal是根据当前线程对象取值,所以多线程各自的Connection对象不会受到影响    // cons:仅仅保存事务相关的Connection    private static ThreadLocal cons = new ThreadLocal<>();    public static DataSource getDataSource(){        return poll;    }        public static Connection getConnection(){        Connection con = cons.get();        // 1.非事务Connection        if(con == null){            // 目前没有涉及事务            try {                return poll.getConnection();            } catch (SQLException e) {                e.printStackTrace();            }        }        // 2.涉及事务Connection        return cons.get();    }        public static void beginTransaction() throws Throwable {        Connection con = cons.get();        if(con != null){            // 事务已经开启过            throw new Throwable("事务已经开启过,不能重复开启");        }        con = poll.getConnection();        // 开启事务        con.setAutoCommit(false);        cons.set(con);    }        public static void commitTransaction() throws Throwable {        Connection con = cons.get();        if(con == null){            throw new Throwable("事务还未开启,不能提交事务");        }        con.commit();        cons.remove();    }        public static void rollBackTransaction() throws Throwable {        Connection con = cons.get();        if(con == null){            throw new Throwable("事务还未开启,不能回滚事务");        }        con.rollback();        cons.remove();    }        public static void release(Connection con) throws SQLException {        if(con == null)            return;        // 当前线程无事务        if(cons.get() == null)            con.close();        // 非事务的Connection        if(con != cons.get())            con.close();    }

总结

1.相较于JDBC,使用C3P0能够更加高效地建立与数据库的连接,尤其是在高并发随机访问数据库的时候;

2.C3P0通过dataSource.getConnection()从线程池中获取“空闲”连接,真正的数据库连接创建与释放则是由C3P0在后台自行完成的,我们只花费了获取和释放连接占用权的时间;

3.使用c3p0-config.xml代替原来JDBC硬编码的形式,提高了代码复用性。

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1094576.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【C3P0的使用】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2