搭建大型分布式服务(六)SpringBoot整合数据库连接池hikari

1,003 阅读2分钟

一、本文要点

接上文,我们已经把SpringBoot整合mybatis了,本文将介绍SpringBoot如何整合数据库连接池HikariCP,管理我们的数据库连接池。什么是HikariCP?可以看下官网介绍。实际上高版本的Springboot默认使用的连接池就是它,这里着重介绍一下如何配置整合。系列文章完整目录

Fast, simple, reliable. HikariCP is a "zero-overhead" production ready JDBC connection pool. At roughly 130Kb, the library is very light. Read about how we do it here.

  • springboot整合HikariCP

  • junit 5 单元测试

  • 自动回滚单元测试操作DB数据

  • springboot + mybatis + Hikari

二、开发环境

  • jdk 1.8
  • maven 3.6.2
  • mybatis 1.3.0
  • springboot 2.4.3
  • mysql 5.6.46
  • junit 5
  • HikariCP
  • idea 2020

三、修改配置文件

修改application-dev.properties文件。

logging.file.path=./logs

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.jdbc-url=jdbc:mysql://9.135.xxx.xxx:3306/mmc?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=GMT%2B8
spring.datasource.hikari.username=root
spring.datasource.hikari.password=123456
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=primary_pool
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30001
spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL
spring.datasource.hikari.connection-init-sql=set names utf8mb4

五、增加配置类

1、注释掉启动类MemberApplication.java增加@MapperScan。

// @MapperScan(basePackages = "com.mmc.lesson.member.mapper")
@SpringBootApplication
public class MemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }

}

2、编写MemberService.java,这样写的后续增加多数据源的时候会有好处。

@Configuration
@MapperScan(basePackages = {
        "com.mmc.lesson.member.mapper"}, sqlSessionTemplateRef = "hikariSqlSessionTemplate")
public class MemberDataSourceConfiguration {

    @Bean(name = "hikariDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    /**
     * 会话工厂.
     */
    @Bean(name = "hikariSqlSessionFactory")
    public SqlSessionFactory setSqlSessionFactory(@Qualifier("hikariDataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:mysqlMappers/*.xml"));
        bean.setVfs(SpringBootVFS.class);
        return bean.getObject();
    }

    /**
     * 目前只有单元测试用到事务.
     */
    @Bean(name = "hikariTransactionManager")
    public PlatformTransactionManager platformTransactionManager(@Qualifier("hikariDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * mybatis用到会话.
     */
    @Bean(name = "hikariSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("hikariSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

六、运行一下

1、编写单元测试。

@Slf4j
@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional // 自动回滚单元测试插入DB的数据
public class MemberServiceTest {

    @Resource
    private MemberService memberService;

    /**
     * add.
     */
    @Test
    public void testAdd() {

        TblMemberInfo member = new TblMemberInfo();
        member.setUname("zhangsan");
        member.setUsex(1);
        member.setUbirth(new Date());
        member.setUtel("888");
        member.setUaddr("凌霄殿");
        member.setState(0);
        member.setDelFlag(0);
        member.setUphoto(null);

        TblMemberInfo ret = memberService.save(member);

        Assertions.assertThat(ret).isNotNull();
        log.info("--------------------------------------------------");
        log.info(ret.getUname());


    }

}

2、效果。

[2021-02-25 12:03:41.974] [main] [DEBUG] [c.m.l.member.mapper.TblMemberInfoMapper.insert:?] - ==> Parameters: null, zhangsan(String), 1(Integer), 2021-02-25 12:03:41.729(Timestamp), 888(String), 凌霄殿(String), null, null, 0(Integer), 0(Integer), null
[2021-02-25 12:03:41.990] [main] [DEBUG] [c.m.l.member.mapper.TblMemberInfoMapper.insert:?] - <==    Updates: 1
[2021-02-25 12:03:41.991] [main] [DEBUG] [org.mybatis.spring.SqlSessionUtils:?] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2d64c100]
[2021-02-25 12:03:42.032] [main] [INFO] [com.mmc.lesson.member.service.MemberServiceTest:?] - --------------------------------------------------
[2021-02-25 12:03:42.032] [main] [INFO] [com.mmc.lesson.member.service.MemberServiceTest:?] - zhangsan

七、小结

有同学留言说怎样使用阿里的druid作为数据库连接池,不急后面会介绍,完整代码地址:戳这里。下一篇《搭建大型分布式服务(七)SpringBoot整合数据库连接池druid》

加我一起交流学习!