数据库连接池c3p0学习笔记

回顾JDBC开发流程

  • 加载驱动(只需要一次)
  • 建立数据库连接(拿到Connection)
  • 执行SQL语句(Statement)
  • Resultset接收结果集(查询)
  • 断开连接,释放资源

数据库连接对象是通过DriverManager来获取的,每次获取都要向数据库申请获取连接,验证用户名和密码,执行完SQL语句后断开连接。这非常的浪费资源,资源利用率很低,复用性低。(想打电话,买了个手机,打完电话就扔了)

那咋办嘛???

概述

  • 背景:解决上述问题(用完扔掉——>用完还回连接池)

  • 本质:为数据库建立一个Connection缓冲池,预先向缓冲池中放入一定数量的连接对象,当需要获取数据库连接时,只要从池子里拿一个出来就好,用完后放回池子。(买n部电话,大家合着用)

  • 作用:提高效率,资源得以重复利用,避免重复创建

  • 当连接池中没有空闲连接时,多的请求进入等待队列

实现

  • JDBC的数据库连接池使用javax.sql.DataSource接口来完成的(DataSource是官方提供的接口,使用的时候开发者不需要自己来实现接口,可以使用第三方工具,C3P0就是一个常用的第三方实现,实际开发中直接使用C3P0即可)

  • 步骤

    • 导入jar包
      • c3p0
      • mchange-commons-java
    • 创建c3p0
    • 和JDBC一样配置连接信息
    • 获取连接对象com.mchange.v2.c3p0.impl.NewProxyConnection@2d6d8735 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@ba4d54]
    • 处理
    • close(),把连接对象还给连接池(这里不是释放资源
  • 代码

package com.microsoft.jdbc;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;

public class DataSourceTest {
    public static void main(String[] args) {
        try {
            // 创建c3p0
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            // 配置连接信息
            dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=UTF-8");
            dataSource.setUser("root");
            dataSource.setPassword("admin");
            Connection connection = dataSource.getConnection();
            //System.out.println(connection);
            
            // 还回到数据库连接池
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

常用方法

// 设置初始化连接个数
dataSource.setInitialPoolSize(20);
// 设置连接池最大连接数(线程数不够再拿)
dataSource.setMaxPoolSize(40);
// 连接对象不够的时候,再次申请的个数
dataSource.setAcquireIncrement(5);
// 设置连接池最小连接数(比如这里只剩2个就要再去申请)
dataSource.setMinPoolSize(2);

关于配置

  • 尽量少改源码,数据不要写死,否则效率很低,每次改完还要再次编译
  • 解决方案——用配置文件xml,改配置即可,大大提升效率

简化后的java文件

package com.microsoft.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.*;

public class JDBCTools {

    private static DataSource dataSource;

    static {
        dataSource = new ComboPooledDataSource("testc3p0");
    }

    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if(statement != null){
                statement.close();
            }
            if (connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

自己新建一个配置文件c3p0-config.xml(注意符号’&'要写& amp;)

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>

    <named-config name="testc3p0">
        <!-- 指定数据库连接源的基本属性 -->
        <property name="user">root</property>
        <property name="password">admin</property>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/how2java?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">20</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">40</property>
    </named-config>

</c3p0-config>
  • 常见错误
    • 文件名一定是c3p0-config.xml
    • 初始化ComboPooledDataSource时,传入的参数一定是xml中中的name属性值
    • 配置文件直接放在src下就行了(与包同级)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值