C3P0连接池的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C3P0连接池的使用相关的知识,希望对你有一定的参考价值。

C3P0连接池的使用

c3p0连接池的概念

C3P0是一个开源的JDBC连接池,实现了数据源的链接,支持JDBC3规范和实现JDBC2的标准扩展说明的Connection和Statement池的DataSources对象。

使用c3p0的作用

首先之前使用JDBC操作了数据库,一般的代码步骤分为:加载驱动、建立链接、创建语句、执行语句、关闭资源等操作,其中的步骤建立连接,每一次操作数据库的时候,都需要获取Connection进行连接,当数据库操作不是很频繁的时候,没有影响,但是如果并发量较高,同时大量的线程需要连接数据库的时候,那么连接的创建将会显得耗时和耗费空间,创建的初始化需要一定的时间,这在一定程度上会影响代码的性能。
所以为了应对以上的情况,C3P0将在连接池中先创建一些连接Connection,等线程需要使用连接的时候直接获取即可,缩短了创建链接的时间,并且在使用完成之后释放到连接池中,而不会真正的关闭资源,等待下一次链接任务,这样可以提高响应的速度。
线程池的主要作用是负责分配、管理和释放数据库的连接

使用连接池后的优势

1、资源的高效利用:在c3p0连接池中,因为可以重复的使用已经存在的连接,所以避免了频繁的创建和释放连接,由此减少了大量的性能消耗。
2、更快的系统反应速度:因为这些连接都是重复使用的,而不是每次重新创建,需要使用的时候直接获取便可连接,减少了系统的响应时间。
3、统一的连接管理,避免数据库的连接泄露。

c3p0连接池的实际操作

1、数据库准备

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `money` double DEFAULT NULL,
  `register_time` datetime DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (‘1‘, ‘张三三‘, ‘zhangsan‘, ‘100.9‘, ‘2020-05-20 17:09:15‘);
INSERT INTO `t_user` VALUES (‘2‘, ‘李四‘, ‘lisi‘, ‘200.8‘, ‘2020-05-20 17:09:28‘);
INSERT INTO `t_user` VALUES (‘3‘, ‘王五‘, ‘wangwu‘, ‘1000‘, ‘2020-05-20 17:09:43‘);
INSERT INTO `t_user` VALUES (‘4‘, ‘root‘, ‘root‘, ‘100000‘, ‘2020-05-20 17:09:56‘);
INSERT INTO `t_user` VALUES (‘5‘, ‘admin‘, ‘admin‘, ‘50.5‘, ‘2020-05-20 17:10:11‘);

2、c3p0连接池的依赖jar包
技术图片

下载地址:链接:https://pan.baidu.com/s/1N5xhm6HtrkrDBRJhz7YmbQ

3、c3p0连接池的配置文件c3p0-config.xml

说明:c3p0-config.xml配置文件为连接池的模板文件,必须放在src文件夹下面,并且名字不能随意修改。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 这个为默认的数据库链接参数配置 -->
    <default-config>
        <!-- 这里就配置最创建的参数 -->
        <!-- 用于mysql数据库链接的四个参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db_demo?useUnicode=true&amp;characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password"></property>

        <!-- 配置数据库连接池的其他配置 -->
        <!-- 连接池初始连接数 -->
        <property name="initialPoolSize">10</property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">10</property>
        <!-- 获取连接数 -->
        <property name="acquireIncrement">5</property>
        <!-- 最大连接数 -->
        <property name="maxPoolSize">100</property>
        <!-- 最大连接时间 -->
        <property name="maxIdleTime">30</property>
    </default-config>
</c3p0-config>
  • 使用C3P0连接池完成向数据库中新增数据
import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * 
 * <p>Title: AddTest</p> 
 * <p>Description: c3p0添加的方法</p> 
 * @author Alon
 * @date 2020年5月22日
 */
public class InsertTest {
    //声明两个属性:
    private static Connection conn  = null;
    private static PreparedStatement ps = null;

    public static void main(String[] args) {
        try {
            //获取链接:
            conn = C3P0Utils.getConn();
            //编写sql语句
            String sql = "INSERT INTO t_user(user_name,password,money) value(?,?,?)";
            //创建执行sql语句的对象
            ps = conn.prepareStatement(sql);
            //设置?的值
            ps.setString(1, "小白");
            ps.setString(2, "xiaobai");
            ps.setDouble(3, 1000.0);

            //执行sql语句:row为改变了多少行
            int row = ps.executeUpdate();
            System.out.println("改变的行数:"+row);

            //关闭资源
            C3P0Utils.close(conn, ps);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 使用C3P0连接池完成删除数据库中的数据
import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * 
 * <p>Title: DeleteTest</p> 
 * <p>Description: 删除数据库中的内容</p> 
 * @author Alon
 * @date 2020年5月22日
 */
public class DeleteTest {
    //声明两个属性
    private static Connection conn = null;
    private static PreparedStatement ps = null;

    public static void main(String[] args) {
        try {
            //获取链接:
            conn = C3P0Utils.getConn();
            //编写sql语句
            String sql = "DELETE FROM t_user WHERE user_id=7";
            //创建执行sql的对象
            ps = conn.prepareStatement(sql);

            //执行
            int row = ps.executeUpdate();
            System.out.println("改变的行数:"+row);
            //关闭资源
            C3P0Utils.close(conn, ps);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 使用C3P0连接池完成修改数据库中的数据
import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * 
 * <p>Title: UpdateTest</p> 
 * <p>Description: 更新数据库中的数据</p> 
 * @author Alon
 * @date 2020年5月22日
 */
public class UpdateTest {
    //声明两个属性:
    private static Connection conn = null;
    private static PreparedStatement ps = null;

    public static void main(String[] args) {
        try {
            //创建链接
            conn = C3P0Utils.getConn();
            //编写sql语句
            String sql = "UPDATE t_user SET user_name = ? WHERE user_id = ?";
            //获取执行sql的对象
            ps = conn.prepareStatement(sql);

            //设置?的值
            ps.setString(1, "小黑");
            ps.setInt(2, 2);

            //执行sql语句
            int row = ps.executeUpdate();
            System.out.println("修改的行数:"+row);
            //关闭资源
            C3P0Utils.close(conn, ps);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 使用C3P0连接池完成查询数据库中的数据
/**
 * 
 * <p>Title: QueryTest</p> 
 * <p>Description: 查询数据库中的数据</p> 
 * @author Alon
 * @date 2020年5月22日
 */

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

public class QueryTest {
    //声明两个属性:
    private static Connection conn = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    public static void main(String[] args) {
        try {
            //获取数据库的链接
            conn = C3P0Utils.getConn();

            //编写sql语句
            String sql = "SELECT user_id,user_name,password,money,register_time FROM t_user";
            //获取执行sql的对象
            ps = conn.prepareStatement(sql);
            //执行语句并获得链接
            rs = ps.executeQuery();

            //获取数据库中的值
            while(rs.next()) {
                int userId = rs.getInt("user_id");
                String userName = rs.getString("user_name");
                String password = rs.getString("password");
                double money = rs.getDouble("money");
                String time = rs.getString("register_time");

                System.out.print("用户id:"+userId);
                System.out.print("用户名:"+userName);
                System.out.print("密码:"+password);
                System.out.print("金额:"+money);
                System.out.println("注册时间:"+time);
            }

            //关闭资源
            C3P0Utils.close(conn, ps, rs);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上是关于C3P0连接池的使用的主要内容,如果未能解决你的问题,请参考以下文章

c3p0数据库连接池的使用详解

C3P0连接池操作数据库

c3p0,dbcp与druid 三大连接池的区别[转]

C3P0连接池的使用

c3p0连接池的使用

C3P0属性设置和数据库连接池的获取