连接池

Spring数据库连接池

由于Spring Boot的自动化配置机制,大部分对于数据源的配置都可以通过配置参数的方式去改变。只有一些特殊情况,比如:更换默认数据源,多数据源共存等情况才需要去修改覆盖初始化的Bean内容。在Spring Boot自动化配置中,对于数据源的配置可以分为两类:

  • 通用配置:以spring.datasource.*的形式存在,主要是对一些即使使用不同数据源也都需要配置的一些常规内容。比如:数据库链接地址、用户名、密码等。这里就不做过多说明了,通常就这些配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  • 数据源连接池配置:以spring.datasource.<数据源名称>.*的形式存在,比如:Hikari的配置参数就是spring.datasource.hikari.*形式。下面这个是我们最常用的几个配置项及对应说明:
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=500000
spring.datasource.hikari.max-lifetime=540000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.connection-test-query=SELECT 1

这些配置的含义:

  • spring.datasource.hikari.minimum-idle:最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
  • spring.datasource.hikari.maximum-pool-size:最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
  • spring.datasource.hikari.idle-timeout:空闲连接超时时间,默认值60000010分钟,大于等于max-lifetimemax-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
  • spring.datasource.hikari.max-lifetime:连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
  • spring.datasource.hikari.connection-timeout:连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30
  • spring.datasource.hikari.connection-test-query:用于测试连接是否可用的查询语句

手动创建连接池

现在,如果我们坚持使用Spring Boot的自动DataSource配置,并在当前状态下运行我们的项目,它就会像预期的那样工作。Spring Boot将为我们完成所有繁重的基础架构工作。这包括创建一个H2 DataSource实现,它将由HikariCPApache TomcatCommons DBCP自动处理,并设置一个内存数据库实例。

此外,我们甚至不需要创建一个application.properties文件,因为Spring Boot也会提供一些默认的数据库设置。正如我们之前提到的,有时我们需要更高层次的定制,因此我们必须以编程的方式配置自己的DataSource实现。最简单的方法是定义一个DataSource工厂方法,并将其放置在用@Configuration注解的类中。

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource getDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("SA");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
}

当然,我们也可以局部地应用application.properties中定义的属性:

@Bean
public DataSource getDataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.username("SA");
    dataSourceBuilder.password("");
    return dataSourceBuilder.build();
}

并在application.properties文件中额外指定一些:

spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.Driver

Links