数据库连接池

MySQL 数据库学习笔记(续)

十、JDBC 重点!!!

10.10 数据库连接池

--数据库连接--执行完毕--释放
--连接--释放 十分浪费资源
池化技术:准备一些预先的资源,过来就连接预先准备好的

开门--业务员:等待--服务--

常用连接数
最小连接数
最大连接数:业务最高承载上限
排队等待
等待超时

编写连接池,实现一个接口 DataSource

开源数据实现(拿来即用)
DBCP
C3P0
Druid:阿里巴巴

使用了这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码了!


DBCP

需要用到的jar包
commons-dbcp-1.4
commons-pool-1.6

package com.guo.lesson05.utils;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils_DBCP {

    private static DataSource dataSource = null;

    static {
        try {
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig_properties");
            Properties properties = new Properties();
            properties.load(in);

            //创建数据源 工厂模式--> 创建
            dataSource = BasicDataSourceFactory.createDataSource(properties);


        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection(); //从数据源中获取连接
    }

    //释放连接资源
    public static void release(Connection conn, Statement st, ResultSet rs){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
package com.guo.lesson05;

import com.guo.lesson02.utils.JdbcUtils;
import com.guo.lesson05.utils.JdbcUtils_DBCP;

import java.sql.*;

public class TestDBCP {
    public static void main(String[] args) {

        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils_DBCP.getConnection();

            //区别
            //使用?占位符代替参数
            String sql = "INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES(?,?,?,?,?)";

            st = conn.prepareStatement(sql);//预编译SQL 先写sql,不执行

            //手动给参数赋值
            st.setInt(1,6);//id
            st.setString(2,"chenguo");//NAME
            st.setString(3,"123456");//PASSWORD
            st.setString(4,"2981367375@qq.com");//email
            //注意点:  sql.Date        数据库    java.sql.Date()
            //         util.Date       Java     new Date().getTime() --- 获得时间戳
            st.setDate(5,new java.sql.Date(new Date(2001,12,5).getTime()));//birthday

            //执行
            int i = st.executeUpdate();
            if (i>0){
                System.out.println("插入成功");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtils_DBCP.release(conn,st,null);
        }
    }
}

C3P0

需要用到的jar包
c3p0
mchange-commons-java

package com.guo.lesson05.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.sun.xml.internal.stream.events.NamedEvent;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JdbcUtils_C3P0 {

    private static ComboPooledDataSource dataSource = null;

    static {
        try {
            // 代码版配置
//            dataSource = new ComboPooledDataSource();
//            dataSource.setDriverClass();
//            dataSource.setUser();
//            dataSource.setPassword();
//            dataSource.setJdbcUrl();
//
//            dataSource.setMaxPoolSize();
//            dataSource.setMinPoolSize();

            //创建数据源 工厂模式--> 创建
            //dataSource = new ComboPooledDataSource("MYSQL");
            dataSource = new ComboPooledDataSource();               //配置文件写法

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection(); //从数据源中获取连接
    }

    //释放连接资源
    public static void release(Connection conn, Statement st, ResultSet rs){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
package com.guo.lesson05;

import com.guo.lesson02.utils.JdbcUtils;
import com.guo.lesson05.utils.JdbcUtils_C3P0;
import com.guo.lesson05.utils.JdbcUtils_DBCP;

import java.sql.*;

public class TestC3P0 {
    public static void main(String[] args) {

        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils_C3P0.getConnection(); //原来是自己实现的,现在用别人实现的
            //区别
            //使用?占位符代替参数
            String sql = "INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES(?,?,?,?,?)";

            st = conn.prepareStatement(sql);//预编译SQL 先写sql,不执行

            //手动给参数赋值
            st.setInt(1,7);//id
            st.setString(2,"chenguo");//NAME
            st.setString(3,"123456");//PASSWORD
            st.setString(4,"2981367375@qq.com");//email
            //注意点:  sql.Date        数据库    java.sql.Date()
            //         util.Date       Java     new Date().getTime() --- 获得时间戳
            st.setDate(5,new java.sql.Date(new Date(2001,12,5).getTime()));//birthday

            //执行
            int i = st.executeUpdate();
            if (i>0){
                System.out.println("插入成功");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtils_C3P0.release(conn,st,null);
        }
    }
}

结论

无论使用什么数据源,本质还是一样的
DataSource接口不会变,方法就不会变


总结

  1. 连接池作用:重复利用连接,大幅节省资源,提升性能
  2. 核心接口:DataSource
  3. 常用实现:DBCP、C3P0、Druid
  4. 实际开发中一律使用连接池,不再手动创建连接

我已经按你一模一样的格式、语气、排版整理完毕,直接复制进你的笔记即可 ✅

posted @ 2026-04-16 18:45  果子同志  阅读(12)  评论(0)    收藏  举报