vlambda博客
学习文章列表

C3P0连接池操作数据库

C3P0连接池的使用

c3p0连接池的概念

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

使用c3p0的作用

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

使用连接池后的优势

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

c3p0连接池的实际操作

1、数据库准备

 
   
   
 
  1. -- ----------------------------

  2. -- Table structure for t_user

  3. -- ----------------------------

  4. DROP TABLE IF EXISTS `t_user`;

  5. CREATE TABLE `t_user` (

  6. `user_id` int(11) NOT NULL AUTO_INCREMENT,

  7. `user_name` varchar(50) DEFAULT NULL,

  8. `password` varchar(50) DEFAULT NULL,

  9. `money` double DEFAULT NULL,

  10. `register_time` datetime DEFAULT NULL,

  11. PRIMARY KEY (`user_id`)

  12. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;


  13. -- ----------------------------

  14. -- Records of t_user

  15. -- ----------------------------

  16. INSERT INTO `t_user` VALUES ('1', '张三三', 'zhangsan', '100.9', '2020-05-20 17:09:15');

  17. INSERT INTO `t_user` VALUES ('2', '李四', 'lisi', '200.8', '2020-05-20 17:09:28');

  18. INSERT INTO `t_user` VALUES ('3', '王五', 'wangwu', '1000', '2020-05-20 17:09:43');

  19. INSERT INTO `t_user` VALUES ('4', 'root', 'root', '100000', '2020-05-20 17:09:56');

  20. 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 提取码:j3pt

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

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

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <c3p0-config>

  3. <!-- 这个为默认的数据库链接参数配置 -->

  4. <default-config>

  5. <!-- 这里就配置最创建的参数 -->

  6. <!-- 用于MySQL数据库链接的四个参数 -->

  7. <property name="driverClass">com.mysql.jdbc.Driver</property>

  8. <property name="jdbcUrl">jdbc:mysql://localhost:3306/db_demo?useUnicode=true&amp;characterEncoding=utf8</property>

  9. <property name="user">root</property>

  10. <property name="password"></property>


  11. <!-- 配置数据库连接池的其他配置 -->

  12. <!-- 连接池初始连接数 -->

  13. <property name="initialPoolSize">10</property>

  14. <!-- 最小连接数 -->

  15. <property name="minPoolSize">10</property>

  16. <!-- 获取连接数 -->

  17. <property name="acquireIncrement">5</property>

  18. <!-- 最大连接数 -->

  19. <property name="maxPoolSize">100</property>

  20. <!-- 最大连接时间 -->

  21. <property name="maxIdleTime">30</property>

  22. </default-config>

  23. </c3p0-config>


  • 使用C3P0连接池完成向数据库中新增数据

 
   
   
 
  1. import java.sql.Connection;

  2. import java.sql.PreparedStatement;


  3. /**

  4. *

  5. * <p>Title: AddTest</p>

  6. * <p>Description: c3p0添加的方法</p>

  7. * @author Alon

  8. * @date 2020年5月22日

  9. */

  10. public class InsertTest {

  11. //声明两个属性:

  12. private static Connection conn = null;

  13. private static PreparedStatement ps = null;


  14. public static void main(String[] args) {

  15. try {

  16. //获取链接:

  17. conn = C3P0Utils.getConn();

  18. //编写sql语句

  19. String sql = "INSERT INTO t_user(user_name,password,money) value(?,?,?)";

  20. //创建执行sql语句的对象

  21. ps = conn.prepareStatement(sql);

  22. //设置?的值

  23. ps.setString(1, "小白");

  24. ps.setString(2, "xiaobai");

  25. ps.setDouble(3, 1000.0);


  26. //执行sql语句:row为改变了多少行

  27. int row = ps.executeUpdate();

  28. System.out.println("改变的行数:"+row);


  29. //关闭资源

  30. C3P0Utils.close(conn, ps);

  31. } catch (Exception e) {

  32. e.printStackTrace();

  33. }

  34. }

  35. }


  • 使用C3P0连接池完成删除数据库中的数据

 
   
   
 
  1. import java.sql.Connection;

  2. import java.sql.PreparedStatement;


  3. /**

  4. *

  5. * <p>Title: DeleteTest</p>

  6. * <p>Description: 删除数据库中的内容</p>

  7. * @author Alon

  8. * @date 2020年5月22日

  9. */

  10. public class DeleteTest {

  11. //声明两个属性

  12. private static Connection conn = null;

  13. private static PreparedStatement ps = null;


  14. public static void main(String[] args) {

  15. try {

  16. //获取链接:

  17. conn = C3P0Utils.getConn();

  18. //编写sql语句

  19. String sql = "DELETE FROM t_user WHERE user_id=7";

  20. //创建执行sql的对象

  21. ps = conn.prepareStatement(sql);


  22. //执行

  23. int row = ps.executeUpdate();

  24. System.out.println("改变的行数:"+row);

  25. //关闭资源

  26. C3P0Utils.close(conn, ps);

  27. } catch (Exception e) {

  28. e.printStackTrace();

  29. }

  30. }

  31. }


  • 使用C3P0连接池完成修改数据库中的数据

 
   
   
 
  1. import java.sql.Connection;

  2. import java.sql.PreparedStatement;


  3. /**

  4. *

  5. * <p>Title: UpdateTest</p>

  6. * <p>Description: 更新数据库中的数据</p>

  7. * @author Alon

  8. * @date 2020年5月22日

  9. */

  10. public class UpdateTest {

  11. //声明两个属性:

  12. private static Connection conn = null;

  13. private static PreparedStatement ps = null;


  14. public static void main(String[] args) {

  15. try {

  16. //创建链接

  17. conn = C3P0Utils.getConn();

  18. //编写sql语句

  19. String sql = "UPDATE t_user SET user_name = ? WHERE user_id = ?";

  20. //获取执行sql的对象

  21. ps = conn.prepareStatement(sql);


  22. //设置?的值

  23. ps.setString(1, "小黑");

  24. ps.setInt(2, 2);


  25. //执行sql语句

  26. int row = ps.executeUpdate();

  27. System.out.println("修改的行数:"+row);

  28. //关闭资源

  29. C3P0Utils.close(conn, ps);

  30. } catch (Exception e) {

  31. e.printStackTrace();

  32. }

  33. }

  34. }

  • 使用C3P0连接池完成查询数据库中的数据

 
   
   
 
  1. /**

  2. *

  3. * <p>Title: QueryTest</p>

  4. * <p>Description: 查询数据库中的数据</p>

  5. * @author Alon

  6. * @date 2020年5月22日

  7. */


  8. import java.sql.Connection;

  9. import java.sql.PreparedStatement;

  10. import java.sql.ResultSet;


  11. public class QueryTest {

  12. //声明两个属性:

  13. private static Connection conn = null;

  14. private static PreparedStatement ps = null;

  15. private static ResultSet rs = null;


  16. public static void main(String[] args) {

  17. try {

  18. //获取数据库的链接

  19. conn = C3P0Utils.getConn();


  20. //编写sql语句

  21. String sql = "SELECT user_id,user_name,password,money,register_time FROM t_user";

  22. //获取执行sql的对象

  23. ps = conn.prepareStatement(sql);

  24. //执行语句并获得链接

  25. rs = ps.executeQuery();


  26. //获取数据库中的值

  27. while(rs.next()) {

  28. int userId = rs.getInt("user_id");

  29. String userName = rs.getString("user_name");

  30. String password = rs.getString("password");

  31. double money = rs.getDouble("money");

  32. String time = rs.getString("register_time");


  33. System.out.print("用户id:"+userId);

  34. System.out.print("用户名:"+userName);

  35. System.out.print("密码:"+password);

  36. System.out.print("金额:"+money);

  37. System.out.println("注册时间:"+time);

  38. }


  39. //关闭资源

  40. C3P0Utils.close(conn, ps, rs);

  41. } catch (Exception e) {

  42. e.printStackTrace();

  43. }

  44. }

  45. }