JDBC03——数据库连接池
基本介绍
问题引出
- 连接5000次数据库
1.不即时关闭连接——抛出异常
package com.recorder.conn; import com.recorder.jdbcutils.JdbcUtils; import org.junit.jupiter.api.Test; /** * @author 紫英 * @version 1.0 * @discription 数据库连接5000问题 */ public class ConQuestion { @Test public void con(){ for (int i = 0; i < 5000; i++) { JdbcUtils.getConnection(); //做一些工作,比如得到 PreparedStatement ,发送 sql // .......... } }
}
2.及时关闭连接——耗费时间过久
package com.recorder.conn; import com.recorder.jdbcutils.JdbcUtils; import org.junit.jupiter.api.Test; import java.sql.Connection; /** * @author 紫英 * @version 1.0 * @discription 数据库连接5000问题 */ public class ConQuestion { @Test public void con() { long start = System.currentTimeMillis(); System.out.println("开始连接....."); for (int i = 0; i < 5000; i++) { Connection connection = JdbcUtils.getConnection(); //做一些工作,比如得到 PreparedStatement ,发送 sql // .......... JdbcUtils.close(null,null,connection); } long end = System.currentTimeMillis(); System.out.println("传统方式5000 次 耗时=" + (end - start));//传统方式 5000次 } }
问题分析
3.就像火车站安检,如果人数过多需要分批进入,一次性涌入会造成混乱。
基本介绍
放回连接池指Java程序不在对连接池中的链接进行引用,该连接依旧存在。
连接池种类
C3P0
第一种方式(不推荐)
public void testC3P0_01() throws Exception { //1. 创建一个数据源对象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); //2. 通过配置文件 jdbc.properties 获取相关连接的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\jdbc.properties")); //读取相关的属性值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //给数据源 comboPooledDataSource 设置相关的参数 // 注意:连接管理是由 comboPooledDataSource 来管理 comboPooledDataSource.setDriverClass(driver); comboPooledDataSource.setJdbcUrl(url); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(password); //设置初始化连接数 comboPooledDataSource.setInitialPoolSize(10); //最大连接数 comboPooledDataSource.setMaxPoolSize(50); //测试连接池的效率, 测试对 mysql 5000 次操作 long start = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) { Connection connection = comboPooledDataSource.getConnection(); //这个方法就是从 DataSource 接口 实现的 //System.out.println("连接 OK"); connection.close(); } long end = System.currentTimeMillis(); //c3p0 5000 连接 mysql 耗时=391 System.out.println("c3p0 5000 连接 mysql 耗时=" + (end - start)); }
第二种方式(推荐——通过XML配置文件)
//第二种方式 使用配置文件模板来完成 // 1. 将 c3p0 提供的 c3p0.config.xml 拷贝到 src 目录下 // 2. 该文件指定了连接数据库和连接池的相关参数 @Test public void testC3P0_02() throws SQLException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("recorder"); //测试 5000 次连接 long start = System.currentTimeMillis(); System.out.println("开始执行...."); for (int i = 0; i < 5000; i++) { Connection connection = comboPooledDataSource.getConnection(); //System.out.println("连接 OK~"); connection.close(); } long end = System.currentTimeMillis(); //c3p0 的第二种方式 耗时=413 System.out.println("c3p0 的第二种方式(500000) 耗时=" + (end - start)); }
Druid(德鲁伊)
代码演示
可以看出效率还是很高的
package com.recorder.conn; import com.alibaba.druid.pool.DruidDataSourceFactory; import org.junit.jupiter.api.Test; import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.Connection; import java.util.Properties; /** * @author 紫英 * @version 1.0 * @discription 德鲁伊连接池 */ public class Druid { @Test public void testDruid() throws Exception { //1. 加入 Druid jar 包 // 2. 加入 配置文件 druid.properties , 将该文件拷贝项目的 src 目录 // 3. 创建 Properties 对象, 读取配置文件 Properties properties = new Properties(); properties.load(new FileInputStream("src\\druid.properties")); //4. 创建一个指定参数的数据库连接池, Druid 连接池 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); long start = System.currentTimeMillis(); for (int i = 0; i < 500000; i++) { Connection connection = dataSource.getConnection(); //System.out.println(connection.getClass()); //System.out.println("连接成功!"); connection.close(); } long end = System.currentTimeMillis(); System.out.println("druid 连接池 操作 500000 耗时=" + (end - start)); } }
德鲁伊
c3p0