JavaWeb篇之三--------使用JDBC连接池

注意

因为本人使用的是maven管理jar包依赖,所以就不演示添加jar包的环节,大家可以自行百度一下所需jar包,至于maven管理依赖我会在以后写一篇详解的。

引言

之前JDBC访问数据库的步骤:
创建数据库连接 →运行SQL语句→关闭连接
每次数据库访问执行这样重复的动作。

每次创建数据库连接的问题:

  • 1.获取数据库连接需要消耗比较多的资源
    每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长,这样数据库连接对象的使用率低。
  • 2.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出。
    所以我们需要使用连接池帮我们解决以上问题。

连接池

连接池的概念:连接池是创建和管理数据库连接的缓冲池技术。连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。

连接池解决现状问题的原理

  1. 程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于碗柜/容器)。
  2. 使用的时候直接从连接池中取一个已经创建好的连接对象。
  3. 关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。

开发中经常使用的连接池有阿里巴巴的德鲁伊Druid和开源的C3P0连接池,今天我就以C3P0作为例子演示一下连接池的使用。

C3P0连接池的使用步骤

其实第一步是导入对应的jar包,我这里就省略了,原因开头就写了

一.配置C3P0的配置文件
因为我是使用的maven所以是在resource目录下创建c3p0-config.xml,不使用maven的小伙伴可以放在源代码即src目录下,要注意,文件名一定要保持一致,C3P0命名配置可以有多个。
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <!-- 使用默认的配置读取连接池对象 -->
    <default-config>
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/demo</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">2000</property>
        <property name="maxIdleTime">1000</property>
    </default-config>


</c3p0-config>

大家可以在我这个配置文件上根据需求自行修改。

主要参数
driverclass:数据库驱动,基本上都是一样的。

jdbcUrl:要操作的数据库对象,如果是和我一样操作本地数据库,那么数据库名之前的东西都是不变的。注意是数据库名不是表的名字

initialPoolSize:刚创建好连接池的时候连接数量

maxPoolSize:连接池中最多可以放多少个连接

checkoutTimeout:连接池中没有连接时最长等待时间

maxIdleTime:连接池中的空闲连接多久没有使用就会回收。默认是0,0表示不回收

二.使用C3P0连接池对本地数据库进行操作
基本上还是重复一个套路,注册驱动(c3p0帮我们完成了),获取连接对象,获取预编译对象,预编译sql语句,释放资源

 public static void main(String[] args) throws Exception {
        //  使用默认配置(default-config)
        // 使用无参构造:new ComboPooledDataSource();
       ComboPooledDataSource ds = new ComboPooledDataSource();
    // 从连接池中取出连接
        Connection conn =  ds.getConnection();

        // 执行SQL语句
        String sql = "SELECT * FROM KamenRider";
        PreparedStatement pstmt = conn.prepareStatement(sql);

        ResultSet resultSet = pstmt.executeQuery();

        while (resultSet.next()){
            System.out.println(resultSet.getString("username")+":"+resultSet.getString("ridername"));
        }

        pstmt.close();
        conn.close(); // 将连接还回连接池中
    }

结果也和之前一样
在这里插入图片描述
相信大家也可以推导出,如果执行多个sql语句,代码的重复率过高,所以我们要想办法写出一个工具类来抽取这些语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值