传统数据库连接的弊端

MySQL的连接数管理 mysql连接数设置_mysql

一个java程序多个正常要开启多个mysql连接-正常开发中次数在1w次往上(还可能有多个java程序-并发编程),但是如果很多歌连接的话,数据库可能就瘫痪了

MySQL的连接数管理 mysql连接数设置_java_02


测试一个程序连接5000次

抛出一个,太多连接的异常

MySQL的连接数管理 mysql连接数设置_java_03


我们也开启完执行完就关闭

也有问题-效率太低

MySQL的连接数管理 mysql连接数设置_数据库_04


MySQL的连接数管理 mysql连接数设置_System_05


消耗大约7s钟

解决这些问题-数据库连接池技术

数据库连接池

MySQL的连接数管理 mysql连接数设置_java_06


1.介绍先在缓冲池中存一定量的连接,当java程序需要连接时候进行申请,用完后释放连接(不是关闭!),连接可以反复使用

2.数据库连接池进行连接的分配管理,释放

3.连接池连接不够用时,新申请的程序要进入等待队列

示意图

MySQL的连接数管理 mysql连接数设置_MySQL的连接数管理_07


具体方法去调用我们连接池的连接,注意:我们释放连接,不是关闭,而是不用那个对象的引用了

数据库连接池种类

DataSource是所有这些连接池的接口

MySQL的连接数管理 mysql连接数设置_System_08

重点还是我们的C3P0!还有Druid!!!
下面会具体讲解
使用这两种需要导入相应的jar包

C3P0

赋值从网上下的jar包,项目中创建文件夹,复制到文件夹下面

右键jar包点击如下图的第一个有个ADD path什么的就导入成功了

MySQL的连接数管理 mysql连接数设置_数据库_09


最大连接数:需要在队列等待的临界值

最小连接数:连接池中最小连接(连接一直不用会回收,控制回收)

初始连接数:初始时候连接池的连接数

每次增长连接数:需要增加连接数的增长值,最大为最大连接数

代码

方式1

package yuan.hsp.JDBC.conchi;

import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
import org.junit.jupiter.api.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;

//数据库C3P0数据库连接池
public class C3P0 {
	@Test
public void testc3p0_01() throws Exception {
	//1.创建一个数据源对象(实现DataSource接口)
	ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
	//2.通过配置文件获取相关信息
	Properties properties = new Properties();
	properties.load(new FileInputStream("src\\pra.properties"));
	String user=properties.getProperty("user");
	String password=properties.getProperty("password");
	String url=properties.getProperty("url");
	String driver=properties.getProperty("driver");
	//3.给数据源设置相关参数
	//注意我们连接管理由comboPooledDataSource来管理
	comboPooledDataSource.setDriverClass(driver);
	comboPooledDataSource.setJdbcUrl(url);
	comboPooledDataSource.setUser(user);
	comboPooledDataSource.setPassword(password);
	//4.设置初始连接数
	comboPooledDataSource.setInitialPoolSize(10);//设置初始为10个(就是连接池创建里面有多少个连接)
	//最大连接数
	comboPooledDataSource.setMaxPoolSize(50);//最大连接数为50(就是当你10个用完,还有想要用的,增加连接-最多到50个,第51个去队列等待)
	//测试一下效率
	long start = System.currentTimeMillis();
	//5.获取连接!核心
	for(int i=0;i<5000;i++) {
	Connection connection = comboPooledDataSource.getConnection();//这个方法是从DataSource接口实现的
	connection.close();//释放连接,底层不一样不过还是那个接口
	}
	long end = System.currentTimeMillis();
	System.out.println("耗费时间为"+(end-start));
}
}

MySQL的连接数管理 mysql连接数设置_System_10


365比上面的7099少很多

效率更高

方式2

利用C3P0提供的配置文件进行完成

对应文件名c3p0-config.xml

将该文件复制到src目录

该文件指定了连接数据库和连接池的相关参数

点击这个文件

可以进行相关参数的修改

MySQL的连接数管理 mysql连接数设置_java_11

把什么驱动类什么的改成我们的对应路径
还有用户密码什么的
也可以设置连接数什么的

MySQL的连接数管理 mysql连接数设置_System_12


注意这个最开始的这个是数据源名称

就这样几行简单的代码就ok了

因为其他的已经在xml文件了配置了

@Test
	public void CP30test02() throws SQLException {
		ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hello");
		long start = System.currentTimeMillis();
		for(int i=0;i<5000;i++) {
			Connection connection = comboPooledDataSource.getConnection();
			connection.close();//这里是释放连接底层不一样
		}
		long end = System.currentTimeMillis();
		System.out.println("耗费时间为"+(end-start));
	}

MySQL的连接数管理 mysql连接数设置_System_13


也是可以连接成功且效率高的

德鲁伊连接池

这个效率来说最高
第一步还是加入jar包奥
就之前的步骤

package yuan.hsp.JDBC.conchi;

import java.io.FileInputStream;

import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;

import org.junit.jupiter.api.Test;

import com.alibaba.druid.pool.DruidDataSourceFactory;


//测试德鲁伊使用
public class Druid {
	
	@Test
public void testdruid() throws Exception {
	//1.jar包导入和配置文件加入到src目录下面
	//这个配置文件(properties)里面有各种数据库连接池的信息
	//-#max wait time (5000 mil seconds)特别解释一下这个是最长等待时间,等待超过这个时间,放弃等待下一次申请连接
	//2.创建properties读取
	Properties properties = new Properties();
	properties.load(new FileInputStream("src\\druid.properties"));
	//3.创建一个指定的数据库连接池
	DataSource createDataSource = DruidDataSourceFactory.createDataSource(properties);
	long start = System.currentTimeMillis();
	for(int i=0;i<5000;i++) {
	Connection connection = createDataSource.getConnection();
	connection.close();//这个不是关闭操作时间上是返还操作
	}
	long end = System.currentTimeMillis();
	System.out.println("消耗时间"+(end-start));
}
}

配置文件

MySQL的连接数管理 mysql连接数设置_MySQL的连接数管理_14


记得不要有空格!

MySQL的连接数管理 mysql连接数设置_System_15


为什么这里393比之前C3P0的346高?

因为连接次数5000次其实是挺小的

50w次的话这个

德鲁伊比C3P0大

两种高处理量的效率对比

50w次的连接申请

C3P0

MySQL的连接数管理 mysql连接数设置_MySQL的连接数管理_16


Druid

MySQL的连接数管理 mysql连接数设置_MySQL的连接数管理_17


显然Druid效率高一些