SpringBoot 常用的两种数据库连接池

3,009 阅读4分钟

最初是操作数据库的时候去建立数据库连接,操作完成之后再关闭这个连接;到后面发现这样大部分时间都花在了建立数据库连接上,业务增长时会严重影响程序的性能

所以就出现了数据库连接池,它可以在系统初始化的时候一次创建多个数据库连接放入连接池当中,并且可以随着业务的变动动态的增加或减少连接池当中的连接,这样就不仅能够提高程序性能,并且解放开发人员,让其专注于业务

常用的数据库连接池

SpringBoot中常用的数据库连接池有两种:HicariCPDruid,它们可以满足多种不同的应用场景,下面就从实际应用来介绍一下

HicariCP

HicariCPSpringBoot2.0之后默认的数据库连接池,特点就是:简单,高效,史称最快的数据库连接池

SpringBootHicariCP的依赖

SpringBoot项目中如果使用到了spring-boot-starter-jdbc或者spring-boot-starter-data-jpa的starter,那就会自动引入HicariCP的依赖了,如果没有,那么也可以直接添加HicariCP的依赖,如下所示:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.5.1</version>
</dependency>
HicariCP使用

首先就是对数据源的配置,下面是一个基于Postgre数据库的配置,首先还是要引入postgre依赖,如下所示:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

接下来在resource/application.properties中添加如下的配置:

spring.datasource.url=jdbc:postgresql://localhost:5432/test?tcpKeepAlive=true
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
​
spring.datasource.hikari.connection-timeout=20000  //超时连接时间
spring.datasource.hikari.minimum-idle=5            // 最小空闲连接
spring.datasource.hikari.maximum-pool-size=12     // 最大连接数
spring.datasource.hikari.idle-timeout=300000     // 连接允许在池中闲置的最长时间  
spring.datasource.hikari.max-lifetime=1200000    // 连接最大生命周期
spring.datasource.hikari.auto-commit=true   // 自动提交从池中返回的连接 

因为HicariCP实现了Datasource接口,JPA会自动装配Datasource,所以就可以直接使用JPA来查询数据了,如下所示的例子:

@Data
@Entity  //表明此实体是一个被 JPA管理的实体类
public class Config {
    @Id
    private String name;
    private String params;
}

然后,再创建Repository类,如下所示:

import org.springframework.data.repository.CrudRepository;
import com.example.demo.models.Config;
​
public interface ConfigRepository extends CrudRepository<Config,Long> { 
}

之后就可以在 service中使用该实体的crud操作了,如下所示:

@Service
public class ConfigService implements IConfigService {
    
    @Autowired
    private ConfigRepository repo;
    @Override
    public List<Config> getAllConfig(){
        List<Config> list = new ArrayList<>();
        repo.findAll().forEach(e ->list.add(e));
        return list;
    }
}

Druid连接池

Druid是阿里开源的数据库连接池,结合了其他数据库连接池的优点,相较于HicariCP增加了监控功能同时还不影响性能,并且能够防止SQL注入,内置的Logging能够诊断Hack的行为

SpringBoot整合Druid依赖

SpringBoot整合Druid可以使用Druid依赖,也可以使用Druid Stater依赖;前者需要程序中加载数据源,后者则会直接通过spring-boot自动装配

Durid依赖

首先需要在 pom.xml文件中添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--Druid-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>
<!--postgre-->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

然后在配置文件中添加配置:

spring:
    datasource:
        ## 指定数据库连接池类型,如果可以得到HikariCP连接池类,就优先配置HikariCP
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:postgresql://localhost:5432/test?tcpKeepAlive=true
        username: postgres
        password: postgres
        driver-class-name: org.postgresql.Driver

最后在代码中加载Druid数据源就好了

@Configuration
public class DruidConfig {
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
}

这样就直接将Druid类型的数据库加载到SpringBoot中了,其他组件就可以自动装配了,下面是一个测试用例:

@SpringBootTest
class DemoApplicationTests {
​
    @Autowired
    private DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        System.out.println(dataSource.getClass());
        Connection connection =   dataSource.getConnection();
        System.out.println(connection);
        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
        System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
        connection.close();
    }
}
Druid Starter依赖

当然也可以直接使用Druid stater依赖,这样就不需要我们手动去加载Druid数据源了,程序启动的时候就会自动加载到SpringBoot中了

Druid starter依赖如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.22</version>
</dependency>

接下来再添加配置文件就可以了

spring:
    datasource:
       # type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:postgresql://172.21.84.188:5432/ticket?tcpKeepAlive=true
        username: postgres
        password: 123456
        driver-class-name: org.postgresql.Driver
    druid:
        initialSize: 5
        minIdle: 5
        maxActive: 200
        maxWait: 60000

这样就可以使用SpringBoot自动装配了,下面是测试代码:

@SpringBootTest
class DemoApplicationTests {
​
    @Autowired
    private DataSource dataSource;
​
    @Test
    public void contextLoads() throws SQLException {
        Connection connection =   dataSource.getConnection();
        System.out.println(connection);
​
        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 最大连接数:" + druidDataSource.getMaxActive());
        System.out.println("druidDataSource 初始化连接数:" + druidDataSource.getInitialSize());
        connection.close();
    }
}

使用starter更加的方便,只需要添加相应的配置就可以了