JDBC ---> c3p0连接池

  • C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml.
  • 使用C3P0需要添加c3p0-0.9.1.2.jar

通过硬编码来编写

  • 创建C3P0连接池对象
  • 设置连接池参数
  • 获得连接
  • 预编译sql语句,得到预编译对象
  • 设置sql语句参数
  • 执行sql语句,处理结果
  • 释放资源
package com.c3p0;

import bean.JDBCUtils;
import com.Utils.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;

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

/**
 * @Author: Mr.Xu
 * @description: c3p0连接池 硬编码的方式
 * @Date: 2021/10/16  10:18
 */
public class Test_1 {
    public static void main(String[] args) throws Exception {
        //硬编码模式
        // - 创建C3P0连接池对象
        ComboPooledDataSource dateSource = new ComboPooledDataSource();
        // - 设置连接池参数
        dateSource.setDriverClass("com.mysql.jdbc.Driver");
        dateSource.setJdbcUrl("jdbc:mysql://localhost:3306/day19_1");
        dateSource.setUser("root");
        dateSource.setPassword("toor");
        dateSource.setInitialPoolSize(5);
        // - 获得连接
        Connection connection = dateSource.getConnection();
        // - 预编译sql语句,得到预编译对象
        String sql = "select * from user where id = ?";
        PreparedStatement pps = connection.prepareStatement(sql);
        // - 设置sql语句参数
        pps.setInt(1,1);
        // - 执行sql语句,处理结果
        ResultSet resultSet = pps.executeQuery();

        // - 定义user变量存储数据,初始值为null
        User user = null;

        //循环遍历表中数据
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String nickname = resultSet.getString("nickname");

            user = new User(id,username,password,nickname);
            System.out.println(user);
        }

        // - 释放资源
        JDBCUtils.release(resultSet, pps,connection);

        //打印结果
        System.out.println(user);
    }
}


通过配置文件来编写

思路:

  • 拷贝c3p0-config.xml配置文件到src路径下,然后修改配置文件中的参数值
    • 配置文件名一定不能修改
    • 配置文件一定要放在src路径下
    • 配置文件中标签的name属性值要与setXXX方法的方法名对应( set方法去掉set,然后首字母变小写)
  • 创建C3P0连接池对象------>自动读取src路径下的c3p0-config.xml配置文件
  • 通过连接池对象获得连接对象
  • 预编译sql语句,得到预编译对象
  • 设置参数
  • 执行sql语句,处理结果
  • 释放资源
package com.c3p0;

import com.Utils.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;

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

/**
 * @Author: Mr.Xu
 * @description: 通过配置文件编写
 * @Date: 2021/10/14  20:54
 */
public class Test_2 {
    public static void main(String[] args) throws Exception{
        //创建c3p0对象
        ComboPooledDataSource ps = new ComboPooledDataSource();
        //获取连接
        Connection connection = ps.getConnection();

        //预编译sql语句,得到预编译对象
        String sql = "select * from user where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);

        //设置参数
        statement.setInt(1,5);
        //执行sql语句,处理结果
        ResultSet resultSet = statement.executeQuery();

        //定义user变量,赋初始值为null
        User user = null;
        //循环获取数据
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String nickname = resultSet.getString("nickname");
            user = new User(id,username,password,nickname);
        }

        //释放资源
        // JDBCUtils.release(resultSet,ps,connection);

        //打印结果
        System.out.println(user);
    }
}


使用c3p0改写工具类

  • 问题: 每次需要连接的时候,都需要创建连接池对象,用完了就销毁,所以就会不断的创建连接池,销毁连接池

  • 解决: 整个程序只需要创建一个连接池对象,其余地方直接使用这个唯一的连接池对象获得连接即可

- 工具类:

- 思路:

- 创建唯一的连接池对象---->private static final修饰
- 提供一个获取连接池对象的静态方法
- 提供一个获取连接的静态方法
- 提供一个释放资源的静态方法

工具类:

package com.Utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @Author: Mr.Xu
 * @description: 提取 c3p0 工具类
 * @Date: 2021/10/14  21:28
 */
public class c3p0Utils {
    // - 创建唯一的连接池对象---->private static final修饰
    private static final ComboPooledDataSource cps = new ComboPooledDataSource();
    // - 提供一个获取连接池对象的静态方法
    public static DataSource getDataSources(){
        return cps;
    }

    // - 提供一个获取连接的静态方法
    public static Connection getConnection() throws SQLException {
        return cps.getConnection();
    }
    // - 提供一个释放资源的静态方法
    public static void release(ResultSet resultSet, Statement statement,Connection connection) throws SQLException {
        if (resultSet != null){
            resultSet.close();
        }

        if (statement != null){
            statement.close();
        }

        if (connection != null){
            connection.close();
        }

    }
}

实现:

package com.c3p0;

import com.Utils.User;
import com.Utils.c3p0Utils;

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

/**
 * @Author: Mr.Xu
 * @description: 通过工具类的方式实现增删改查
 * @Date: 2021/10/14  21:44
 */
public class Test_03 {
    public static void main(String[] args) throws Exception{
        //获得驱动,获得连接
        Connection connection = c3p0Utils.getConnection();
        //预编译sql语句,获得对象
        String sql = "select * from user where id = 4";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        // 执行sql语句
        ResultSet resultSet = preparedStatement.executeQuery();

        //定义变量存放数据,初始值为null
        User user = null;

        //循环遍历表中数据
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String nickname = resultSet.getString("nickname");
            user = new User(id,username,password,nickname);
            System.out.println(user);
        }

        //释放资源
        c3p0Utils.release(resultSet,preparedStatement,connection);

    }
}

上一篇:[Aaronyang] 写给自己的WPF4.5 笔记9[复杂数据处理三步曲,数据展示ListView泪奔2/3]


下一篇:SQLServer数据库收缩相关知识笔记