使用数据库连接池C3P0(学会并使用数据库day11)

使用数据库连接池C3P0

  • 数据库连接池C3P0
  • 使用步骤
    • 1、导入jar包
    • 2、获取连接池
    • 3、设置信息
    • 4、设置连接参数信息
    • 5、常见配置项
    • 6、配置文件
    • 7、工具类
  • 使用方式
    • 数据库表
      • 创建表代码
      • 查询结果
    • 第一种配置方式
      • 测试代码
      • 测试结果
    • 第二种配置方式
      • 测试代码
      • 测试结果
    • 报错处理

数据库连接池C3P0

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

使用步骤

1、导入jar包

下载地址
使用数据库连接池C3P0(学会并使用数据库day11)_第1张图片
找到对应路径,在lib目录中,选择jar包,复制粘贴到项目。
使用数据库连接池C3P0(学会并使用数据库day11)_第2张图片
右击选择 add as library添加到项目即可
使用数据库连接池C3P0(学会并使用数据库day11)_第3张图片
有箭头的表示导入成功
使用数据库连接池C3P0(学会并使用数据库day11)_第4张图片

2、获取连接池

// 获取连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();

3、设置信息

dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/demo");
dataSource.setUser("root");
dataSource.setPassword("112112");

4、设置连接参数信息

// 初始化连接池中连接的个数
dataSource.setInitialPoolSize(5);
// 最小|最大连接池中连接的个数
dataSource.setMinPoolSize(2);
dataSource.setMaxPoolSize(10);
// 最大空闲数
dataSource.setMaxIdleTime(60);
// 每次增长个数
dataSource.setAcquireIncrement(2);

5、常见配置项

使用数据库连接池C3P0(学会并使用数据库day11)_第5张图片

6、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="user">root</property>
<property name="password">112112</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/demo
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
<!-- 命名的配置 -->
<named-config name="mysql">
<property name="user">root</property>
<property name="password">112112</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/demo
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>

7、工具类

使用方式

数据库表

创建表代码

CREATE TABLE IF NOT EXISTS employee(
id int(11) auto_increment PRIMARY key,
name VARCHAR(22),
age int(4),
money int(20)
);

INSERT into employee VALUES(null,"张三",20,3650);
INSERT into employee VALUES(null,"李四",30,4502);
INSERT into employee VALUES(null,"王五",30,3650);
INSERT into employee VALUES(null,"麻子",50,8885);
INSERT into employee VALUES(null,"小红",20,4445);

查询结果

使用数据库连接池C3P0(学会并使用数据库day11)_第6张图片

第一种配置方式

直接在代码中配置连接数据库。

测试代码

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class demo1 {
    private static ComboPooledDataSource dataSource;

    public static void main(String[] args) {
        // 创建连接池
        setupDataSource();
        // 获取连接
        Connection connection = null;
        // 创建一个表示预编译 SQL 语句的对象
        PreparedStatement pre=null;
        //创建一个用于存储执行 SQL 查询后返回的结果集的对象
        ResultSet rs=null;
        try {
            connection = dataSource.getConnection();
            // 执行数据库操作
            pre=connection.prepareStatement("select * from employee;");
            rs = pre.executeQuery();

            // 处理查询结果
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                int money = rs.getInt("money");
                System.out.println("编号:" + id + ", 姓名:" + name + ", 年龄:" +
                        age + ", 工资:" + money);
            }
            System.out.println("操作成功!");

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {

            if ( rs!= null){
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (pre != null){
                try {
                    pre.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (connection != null){
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }

        // 关闭连接池
        closeDataSource();
    }

    private static void setupDataSource() {
        dataSource = new ComboPooledDataSource();
        // 设置连接池参数
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/yjg_db03");
        dataSource.setUser("root");
        dataSource.setPassword("yjg");

    }

    private static void closeDataSource() {
        if (dataSource != null) {
            dataSource.close();
        }
    }
}

测试结果

使用数据库连接池C3P0(学会并使用数据库day11)_第7张图片

第二种配置方式

使用配置文件来配置连接数据库,配置文件是上面的那个配置文件,这里使用的连接不是默认配置的方式 ,而是指定了名字的方式。

测试代码

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class testDemo2 {

    public static void main(String[] args) throws SQLException {
        //1.加载配置文件
        // 2.创建DataSource
        DataSource dataSource=new ComboPooledDataSource("mysql");
        //3.得到数据库连接
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            conn=dataSource.getConnection();
            //4.后面的用法就是jdbc的用法了
            String sql="select * from employee;";
            ps=conn.prepareStatement(sql);
            rs=ps.executeQuery();
            // 处理查询结果
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString( "name");
                int age = rs.getInt("age");
                int money = rs.getInt("money");
                System.out.println("编号:" + id + ", 姓名:" + name + ", 年龄:" +
                        age + ", 工资:" + money);
            }
            System.out.println("操作成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            //不要忘记释放资源
            // 使用连接池conn.close()是将连接回收到连接池,
            // 不使用连接池conn.close()关闭,直接释放连接
            if (conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

测试结果

使用数据库连接池C3P0(学会并使用数据库day11)_第8张图片

报错处理

如果出现了报错,检查路径是否正确,配置文件是否放在了资源文件下面。配置名是固定的,底层固定了写法,配置名不能变。还有就是jar包是否导入,版本是否有偏差。
下面是没有放在资源文件下面的报错处理。
错误

java.sql.SQLException: Connections could not be acquired from the underlying database!
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
Caused by: java.lang.NullPointerException

应该把配置文件放在资源文件下面
使用数据库连接池C3P0(学会并使用数据库day11)_第9张图片
创建资源文件
首先创建一个包,我这里是名称是r
使用数据库连接池C3P0(学会并使用数据库day11)_第10张图片
点击File之后找到project structure
使用数据库连接池C3P0(学会并使用数据库day11)_第11张图片
然后找到自己的包,按照下面步骤即可,然后把配置文件放到资源文件里面就可以了。使用数据库连接池C3P0(学会并使用数据库day11)_第12张图片

你可能感兴趣的:(数据库,数据库)