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&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连接池的使用的主要内容,如果未能解决你的问题,请参考以下文章