spring boot 数据源配置

#spring boot默认连接池

spring boot2.x版本默认的连接池是HikariCP,官网链接,里面有许多配置详情,这里我只做一些简单配置。

application.properties配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#这里注释掉是因为spring boot会尽可能判断驱动类型,所以当他不能确定驱动类型的时候在明确配置
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#这里需要注意,mysql数据库版本如果在8或者之上的要加上serverTimezone这个配置,不然会报错,这里主要是时区问题
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=******
spring.datasource.password=******
#设置客户端在等待池中等待的最大时间数,当超过这个时间就会报   
#SQLException异常,最小值为250毫秒,默认3000毫秒
spring.datasource.hikari.connection-timeout=3000
#设置连接空闲多长时间进行删除,但必须在minimumIdle小于maximum-pool-size时才有效,
#且当现连接数大于minimumIdle和空闲时间超出下面设置的这个时间,才会被删除
spring.datasource.hikari.idle-timeout=60000
#设置最大连接数
spring.datasource.hikari.maximum-pool-size=100

当然也可以通过:spring.datasource.type设置其他连接池的类型,但是要加入相应的依赖。 出于好奇,为什么我写了这些配置信息,为什么可以直接使用,然后网上搜了也没搜到,然后想了想应该是spring boot的自动配置,然后看了看源码,然后进行调试,发现真的是这样。

  • 首先我找到DataSourceProperties类,里面有很多信息,挑出一些
1
2
3
4
5
6
7
8
9
@ConfigurationProperties(
    prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
......

这里可以看出我们设置的spring.datasource.username、 spring.datasource.password等信息被上面的那些值给获取了。 但是我们配置的是hikari连接池啊,有点不对劲,然后找到DataSourceConfigration这了类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 @Configuration
    @ConditionalOnClass({HikariDataSource.class})
    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"},
        havingValue = "com.zaxxer.hikari.HikariDataSource",
        matchIfMissing = true
    )
    static class Hikari {
        Hikari() {
        }

        @Bean
        @ConfigurationProperties(
            prefix = "spring.datasource.hikari"
        )
        public HikariDataSource dataSource(DataSourceProperties properties) {
            HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
            if (StringUtils.hasText(properties.getName())) {
                dataSource.setPoolName(properties.getName());
            }

            return dataSource;
        }
    }

里面还有Dbcp2、Generic等连接池的配置,但我们设置的是Hikari,所以匹配到的应该是它,其中还有很多细节方面的东西,不过主要的是这两部分。 其中也有很多注解,之后再一一解决这些吧。