Spring Boot(九):数据库连接池Druid

数据库连接池简介

1、为什么要使用数据库连接池?

创建数据库连接(TCP连接建立时需要三次握手)是一个很耗时的过程,在使用完之后,还需要不断的释放建立的连接(销毁时需要四次握手),对资源的损耗比较大。

数据库连接池会将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接访问数据库,这样可以省略创建连接和销毁连接的过程,从而提高性能。这样做的缺点是,可能某些时候完全没有数据库请求,但是也保持了数据库的最小连接数,浪费了资源,不过这种资源浪费相对于完全不采用数据库连接池还是很有优势的。

2、常用的数据库连接池

目前市场上常用的数据库连接池有:C3P0、Proxool、DBCP、Tomcat JDBC Pool、HiKariCP 和 Druid

性能方面:HiKariCP > Druid > Tomcat JDBC Pool > DBCP > C3P0 > Proxool

活跃度方面:C3P0、Proxool、DBCP的版本都已经很久没更新了,Tomcat JDBC Pool、HiKariCP 和 Druid仍处于活跃的更新中。Spring Boot 2.0 将默认的数据库连接池从Tomcat JDBC Pool 改为了HiKariCP。

虽然HikariCP已经很优秀,但是对于国内用户来说,可能对于Druid更为熟悉,Druid是阿里开源的数据库连接池,除了良好的性能和稳定性外,它还加入了监控统计、防御SQL注入等功能。

Druid的使用

1、引入依赖

在pom.xml中引入Druid的依赖

 
 
    com.alibaba 
    druid-spring-boot-starter 
    1.1.20 

注:

1)如果打包时报如下警告,说明Druid引入的版本太高了,降低版本即可

The POM for com.alibaba:druid:jar:1.1.21 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details 

2、配置application-dev.yml配置文件

spring: 
  datasource: 
    url: jdbc:mysql://localhost:3306/blog 
    username: root 
    password: test 
    type: com.alibaba.druid.pool.DruidDataSource 
    druid: 
      initialSize: 5 
      minIdle: 5 
      maxActive: 20 
      maxWait: 2000 
      validationQuery: select 'x' 
      testOnBorrow: false 
      testOnReturn: false 
      testWhileIdle: true 

注:

1)配置含义的详细说明见文章的第三模块“Druid的配置详解”

3、实体类和dao层配置

在blog数据库中,创建一个article表,然后创建它的实体类和dao层:

article表的实体类:

public class ArticlePo { 

    private Integer id; 
    private String articleId; 
    private String title; 

    // get、set... 
} 

dao层:

@Repository 
public interface ArticleDao { 

    @Select("select * from article where article_id = #{articleId}") 
    @Results({@Result(column = "article_id", property = "articleId")}) 
    ArticlePo get(@Param("articleId") String articleId); 

    // 给article赋值自增主键id 
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") 
    @Insert("insert into article(article_id, title) values(#{article.articleId}, #{article.title})") 
    int insert(@Param("article") ArticlePo articlePo); 

} 

4、修改启动类

在启动类DemoApplication上增加@MapperScan注解

@SpringBootApplication 
@MapperScan(basePackages = "com.tn666.demo.dao") 
public class DemoApplication { 


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


} 

注:

1)@MapperScan注解的属性basePackages配置的为dao层的包路径

5、测试验证

编写ArticleController:

@RestController 
@RequestMapping("/article") 
public class ArticleController { 

    @Resource 
    private ArticleDao articleDao; 

    @GetMapping(value = "/get") 
    public ArticlePo get(@RequestParam("articleId") String articleId) { 
        ArticlePo articlePo = articleDao.get(articleId); 
        return articlePo; 
    } 

    @PostMapping(value = "/insert") 
    public Boolean insert(@RequestBody ArticlePo articlePo) { 
        articleDao.insert(articlePo); 
        Boolean res = false; 
        if (articlePo.getId() > 0) { 
            res = true; 
        } 
        return res; 
    } 

} 

注:

1)业务逻辑复杂时,Controller和Mapper中间会有Service层来处理业务逻辑,现在我们就简单的测试一下Druid数据库连接池,所以直接使用Controller调用Mapper了

Druid的配置详解

Spring Boot(九):数据库连接池Druid_第1张图片

Spring Boot(九):数据库连接池Druid_第2张图片

更多内容,请关注公众号“图南随笔”:

Spring Boot(九):数据库连接池Druid_第3张图片

 

你可能感兴趣的:(MyBatis,Java,SpringBoot,spring,boot,java,mybatis)