langyue 2020-05-31
c3p0连接池的概念
C3P0是一个开源的JDBC连接池,实现了数据源的链接,支持JDBC3规范和实现JDBC2的标准扩展说明的Connection和Statement池的DataSources对象。
使用c3p0的作用
首先之前使用JDBC操作了数据库,一般的代码步骤分为:加载驱动、建立链接、创建语句、执行语句、关闭资源等操作,其中的步骤建立连接,每一次操作数据库的时候,都需要获取Connection进行连接,当数据库操作不是很频繁的时候,没有影响,但是如果并发量较高,同时大量的线程需要连接数据库的时候,那么连接的创建将会显得耗时和耗费空间,创建的初始化需要一定的时间,这在一定程度上会影响代码的性能。
所以为了应对以上的情况,C3P0将在连接池中先创建一些连接Connection,等线程需要使用连接的时候直接获取即可,缩短了创建链接的时间,并且在使用完成之后释放到连接池中,而不会真正的关闭资源,等待下一次链接任务,这样可以提高响应的速度。
线程池的主要作用是负责分配、管理和释放数据库的连接
使用连接池后的优势
1、资源的高效利用:在c3p0连接池中,因为可以重复的使用已经存在的连接,所以避免了频繁的创建和释放连接,由此减少了大量的性能消耗。
2、更快的系统反应速度:因为这些连接都是重复使用的,而不是每次重新创建,需要使用的时候直接获取便可连接,减少了系统的响应时间。
3、统一的连接管理,避免数据库的连接泄露。
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>
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(); } } }
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(); } } }
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(); } } }
/** * * <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(); } } }