8 配置数据源
8.1 使用Spring默认的数据源
在Maven添加如下依赖
<!-- jdbc启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 在
resources/
下新建application.yaml
,配置数据库连接要素
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_schema?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
- 在测试类中进行测试
package com.cap.dbdemo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
@SpringBootTest
class DbdemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
System.out.println("数据源为:"+dataSource);
}
}
- 运行结果如下:
可以看到,Spring的默认数据源为HikariDataSource
我们打开spring-boot-starter-jdbc启动器
在spring-boot-starter-jdbc启动器中,确实使用了HikariCP作为默认的数据库连接池
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200723143731540.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NhcDIyMDU5MA==,size_16,color_FFFFFF,t_70
HikariCP连接池
Hikari,希卡利,日语中意为“光芒”
HikariCP连接池的官网是https://github.com/brettwooldridge/HikariCP
HikariCP连接池作为一个后起之秀,其优点主要有:
- 速度快,执行效率高
- bug少,因其自身代码量少
- 稳定
可以说HikariCP连接池是目前速度最快的连接池,springboot2.0其就将其作为默认的数据库连接池
既然我们知道了SpringBoot将HikariCP作为默认的数据库连接池,那么我们就可以来配置一下HikariCP连接池的一些属性:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_schema?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
## type可以显式地将数据源设置为HikariDataSource
## 这里我们也可以不设置,毕竟默认就是HikariDataSource
type: com.zaxxer.hikari.HikariDataSource
hikari:
## 连接池名字
pool-name: myHikariCP
## 最小空闲连接数量
minimum-idle: 10
## 空闲连接存活最大时间,默认为600000毫秒(10分钟)
idle-timeout: 600000
## 连接池最大连接数量,默认是10
maximum-pool-size: 10
## 设置返回的连接自动提交事务,默认为true
auto-commit: true
## 单个连接最大的连接时间,0表示无生命期限,默认为1800000毫秒(30分钟)
max-lifetime: 1800000
## 连接超时时间,默认为30000毫秒(30秒)
connection-timeout: 30000
注意我们在配置文件中使用
type
属性可以显式设置数据源,这对我们下一节来配置自定义数据源非常有用
8.2 配置自定义数据源——Druid
- 在
pom.xml
中导入Druid启动器
<!-- Druid连接池启动器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
- 修改
application.yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_schema?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: mysql
## 将数据源设置为DruidDataSource
type: com.alibaba.druid.pool.DruidDataSource
- 修改测试方法
package com.cap.dbdemo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
@SpringBootTest
class DbdemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
System.out.println("数据源为:"+dataSource.getClass());
}
}
- 测试结果为:
在测试过程中,我们是让SpringBoot为我们自动生成数据源,接下来我们将自己绑定自定义的数据源,并将其放入IOC容器中
package com.cap.dbdemo.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DruidDataSource {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public static DataSource getDruidDataSource(){
return new com.alibaba.druid.pool.DruidDataSource();
}
}
修改测试方法
package com.cap.dbdemo;
import com.alibaba.druid.pool.DruidDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootTest
class DbdemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
System.out.println("数据源为:"+dataSource.getClass());
System.out.println(dataSource.getConnection());
DruidDataSource druidDataSource =