1.Spring Boot 整合连接池
1.1 SpringBoot 概述
理论开发中应用程序与数据库交互时,“取得连贯”或“开释资源”是十分耗费系统资源的两个过程,为了解决此类性能问题,通常状况咱们采纳连接池技术来重用连贯 Connection 对象,如图 - 1 所示:
Java 为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商须要让本人的连接池实现这个接口。而后咱们的应用程序中耦合与这个接口,便能够不便的切换不同厂商的连接池,常见的连接池有 DBCP、C3P0,DRUID,HikariCP 等。
通过连接池获取连贯的一个根本过程,如图 - 2 所示:
在图 - 2 中,执行原理如下所示
用户通过 DataSource 对象的 getConnection() 办法,获取一个连贯。如果池中有连贯,则间接将连贯返回给用户。如果池中没有连贯,则会调用 Dirver(驱动,由数据库厂商进行实现)对象的 connect 办法从数据库获取,拿到连贯当前,能够将连贯在池中放一份,而后将连贯返回给调用方。
1.2 数据初始化
关上 mysql 控制台, 而后按如下步骤执行 goods.sql 文件:
第一步: 登录 mysql
mysql –uroot –proot
第二步: 设置控制台编码 (MySql 客户端(client)) 形式
set names utf8; -- 告诉服务器客户端所应用的编码为 utf8
第三步: 执行 goods.sql 文件
source d:/goods.sql -- 留神 source 前面跟的是 goods.sql 文件的地位,不要间接将 sql 文件的内容之间拿到命令行或图形化界面工具中间接运行,若 sql 文件中有中文,就会呈现乱码!在理论开发拿到 sql 文件也不要立即去执行,否则会造成不可估量的损失!
备注:当 mysql 连贯数据库失败时,检测服务是否启动,可尝试先启动服务(windows 中须要以管理员关上控制台,而后在控制台执行 net start mysql 启动服务即可,进行 mysql 服务器执行是 net stop mysql)
1.3 整合 HikariCP 连接池
HikariCP 连接池背景介绍
HiKariCP 号称是目前世界上最快的连接池, 有江湖一哥的名称,目前在 springboot 工程默认举荐应用 HiKariCP 连接池。
当初咱们创立一个新的 SpringBoot 我的项目,我的项目名为 CGB-SBOOT-04, 在此工程中整合 HiKariCP, 其步骤如下:
step1:创立 SpringBoot 我的项目。
step2, 增加依赖 (两个 –MySQL 驱动,Spring-JDBC)
编辑我的项目中 pom.xml, 右键我的项目的 pom.xml 文件, 抉择 spring, 如图 - 3 所示:
而后查找 mysql 驱动依赖,JDBC API 依赖,如图 - 4 所示:
依赖增加当前, 在 pom.xml 文件中会主动增加如下两个依赖配置:
mysql 数据库驱动依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring 对象 jdbc 反对(此时会默认帮咱们下载 HiKariCP 连接池)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
step3,配置连接池 (配置连贯数据库的 url,username,password)
关上 application.properties 配置文件,增加如下内容。
##spring datesource
spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
step4:编写单元测试类 DataSourceTests 从池中获取连贯(Connection)(测试包中编写, 测试类必须放在启动类所在包或其子包中!)
package com.cy.pj.commom.datasource;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* 整合 hikariCP 连接池
*1)创立 SpringBoot 我的项目
*2)增加依赖(两个 -MySQL 驱动,Spring-JDBC)
*3)配置 (application.properties) 连贯数据库 url,username,password
* 3.1)spring.datasource.url=jdbc:mysql://localhost:3306/dbgoods?serverTimezone=GMT%2B8&characterEnconding=utf8
* 3.2)spring.datasource.username=root
* 3.3)spring.datasource.password=root
*4)编写测试类 DataSourceTests 从池中获取连贯(Connection)
* @author Administrator
*
*/
@SpringBootTest // 该注解作用将类交给 spring 治理
public class DatasourceTests {
// 思考://1)这里 dataSource 变量指向的对象是谁?你怎么晓得的?-- 指向的是 HikariDateSource 通过断点调试或获取 dateSouece 变量指向的对象的具体类型的全类名
@Autowired
private DataSource dataSource;
@Test
void testConnnction01() throws SQLException {
// 获取 dateSouece 变量指向的对象的具体类型的全类名
//System.out.println("类型 ="+dataSource.getClass().getName());
// 思考:这个连贯的获取过程是怎么的?你怎么晓得的?System.out.println(dataSource.getConnection());
}
@Test
void testConnnction02() throws SQLException, InterruptedException {// long start =System.currentTimeMillis();
// System.out.println(dataSource.getConnection());
// long end =System.currentTimeMillis();
// System.out.println("first:"+(end-start));
// System.out.println(dataSource.getConnection());
// long last =System.currentTimeMillis();
// System.out.println("second:"+(end-last));
Connection conn1 = dataSource.getConnection();
System.out.println("conn1="+conn1);
Connection conn2 = dataSource.getConnection();
System.out.println("conn2="+conn2);
conn1.close();
conn2.close();
Thread.sleep(3000);
Connection conn3 = dataSource.getConnection();
System.out.println("conn3="+conn3);
System.out.println(conn1==conn2);//false
}
}
step5:原理剖析,如图 - 5 所示
图 - 5 中,演示了咱们在测试类 DataSourceTests 中基于 DataSource 获取连贯的一个根本过程。对于图 - 5 中的连贯建设过程,能够在 Driver 接口的实现中的 connect 办法上增加断点,而后进行断点测试,如图 - 6 显示了 API 办法的调用执行过程(按箭头方向开代码),这个理解理解即可
当咱们须要理解,基于 HikariCP 连接池获取数据库连贯,并将获取到的连贯放入到连接池中的过程进行理解,能够参考图 - 7 中的断点设计进行查看即可(不做具体要求)。
在基于图 - 7 中设置的断点序号地位进行单元测试时,能够每次按 F8 进行断点跟踪,理解 HiKariCP 连接池获取连贯存储连贯的过程,其中 API 不了解的能够在搜索引擎中进行查阅剖析。