Spring Boot Druid 数据库连接池入门

1. Druid 单数据源

1.1 引入依赖
在pom.xml文件中,引入相关依赖。


    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.3.RELEASE
         
    
    4.0.0

    lab-19-datasource-pool-druid-single

    
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.21
        
         
            mysql
            mysql-connector-java
            5.1.48
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    


1.2 应用配置文件

在application.yml中,添加 Druid 配置,如下:

spring:
  # datasource 数据源配置内容,对应 DataSourceProperties 配置属性类
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root # 数据库账号
    password: # 数据库密码
    type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
    # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
    druid:
      min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
      max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
      filter:
        stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
          log-slow-sql: true # 开启慢查询记录
          slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒
      stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
        enabled: true # 是否开启 StatViewServlet
        login-username: yudaoyuanma # 账号
        login-password: javaniubi # 密码
  • spring.datasource配置项,设置 Spring 数据源的通用配置。其中,spring.datasource.type配置项,需要主动设置使用 DruidDataSource 。因为默认情况下,spring-boot-starter-jdbc的DataSourceBuilder会按照DATA_SOURCE_TYPE_NAMES的顺序,尝试推断数据源的类型。
  • spring.datasource.druid配置项,设置 Druid 连接池的自定义配置。然后DruidDataSourceAutoConfigure会自动化配置 Druid 连接池。
    • 在《Druid —— 配置属性》和《DruidDataSource 配置属性列表》下,提供了各种 Druid 的配置项,胖友可以自己看看。
    • filter.stat配置项,我们配置了 DruidStatFilter,用于统计监控信息。对应文档《Druid —— 配置_StatFilter》。要注意,StatFilter 并不是我们说的javax.servlet.Filter,而是 Druid 提供的Filter拓展机制。
    • filter.stat-view-servlet配置项,我们配置了 DruidStatViewServlet,用于提供监控信息的展示的 html 页面JSON API。对应文档《Druid —— 配置_StatViewServlet 配置》。StatViewServlet 就是我们说的javax.servlet.Filter。
1.3 Application

创建Application.java类,配置@SpringBootApplication注解即可。代码如下:

@SpringBootApplication
public class Application implements CommandLineRunner {

    private Logger logger = LoggerFactory.getLogger(Application.class);

    @Autowired
    private DataSource dataSource;

    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        logger.info("[run][获得数据源:{}]", dataSource.getClass());
    }

}

执行日志如下:

2019-11-12 19:34:12.079  INFO 48359 --- [           main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2019-11-12 19:34:12.156  INFO 48359 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited

2019-11-12 19:34:12.560  INFO 48359 --- [           main] c.i.s.lab19.datasourcepool.Application   : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
1.4 监控功能

因为我们在 1.2应用配置中,做了如下操作:

  • 通过spring.datasource.filter.stat配置了 StatFilter ,统计监控信息。
  • 通过spring.datasource.filter.stat-view-servlet配置了 StatViewServlet ,提供监控信息的展示的 html 页面和 JSON API 。

所以我们在启动项目后,访问http://127.0.0.1:8080/druid地址,可以看到监控 html 页面。如下图所示:

Spring Boot Druid 数据库连接池入门_第1张图片

  • 在界面的顶部,提供了数据源、SQL 监控、SQL 防火墙等等功能。

  • 每个界面上,可以通过View JSON API获得数据的来源。同时,我们可以在JSON API(?http://127.0.0.1:8080/druid/api.html?)菜单对应的界面中,看到 StatViewServlet 内置的监控信息的 JSON API 列表。

  • 因为监控信息是存储在 JVM 内存中,在 JVM 进程重启时,信息将会丢失。如果我们希望持久化到 MySQL、Elasticsearch、HBase 等存储器中,可以通过 StatViewServlet 提供的 JSON API 接口,采集监控信息。另外,有个druid-aggregated-monitor开源项目,提供了 集中监控分布式服务中的 Druid 连接池的方案和思路。

  • 如果 StatViewServlet 提供的 JSON API 接口,无法满足我们的诉求,我们可以通过自定义 API 接口,使用DruidStatManagerFacade获得监控信息。使用示例DruidStatController代码如下

    @RestController
    public class DruidStatController {

    @GetMapping("/monitor/druid/stat")
    @Deprecated
    public Object druidStat(){
        // `DruidStatManagerFacade#getDataSourceStatDataList()` 方法,可以获取所有数据源的监控数据。
        // 除此之外,DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
    }
    

    }

当然,绝大多数情况下,我们并不需要做这方面的拓展

2. Druid 多数据源

和1.1引入依赖是一致。

5.2 应用配置

在application.yml中,添加 Druid 配置,如下:

spring:
  # datasource 数据源配置内容
  datasource:
    # 订单数据源配置
    orders:
      url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password:
      type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
      # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
      min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
      max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
    # 用户数据源配置
    users:
      url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password:
      type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
      # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
      min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
      max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
    # Druid 自定已配置
    druid:
      # 过滤器配置
      filter:
        stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
          log-slow-sql: true # 开启慢查询记录
          slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒
      # StatViewServlet 配置
      stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
        enabled: true # 是否开启 StatViewServlet
        login-username: yudaoyuanma # 账号
        login-password: javaniubi # 密码
  • 不同于我们在「3.2 应用配置文件」中,我们将 Druid 的自定义配置,和urldriver-class-name等数据源的通用配置放在同一级,这样后续我们只需要使用@ConfigurationProperties(prefix = "spring.datasource.orders")的方式,就能完成 DruidDataSource 的配置属性设置。
  • spring.datasource.druid配置项下,我们还是配置了filter.statstat-view-servlet配置项,用于 Druid 监控功能。
2.3 数据源配置类

在cn.iocoder.springboot.lab19.datasourcepool.config包路径下,我们会创建DataSourceConfig配置类。代码如下:

// DataSourceConfig.java

@Configuration
public class DataSourceConfig {

    /**
     * 创建 orders 数据源
     */
    @Primary
    @Bean(name = "ordersDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.orders") // 读取 spring.datasource.orders 配置到 HikariDataSource 对象
    public DataSource ordersDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 创建 users 数据源
     */
    @Bean(name = "usersDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.users")
    public DataSource usersDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

}
2.4 Application

创建Application.java类,配置@SpringBootApplication注解即可。代码如下:

// Application.java

@SpringBootApplication
public class Application implements CommandLineRunner {

    private Logger logger = LoggerFactory.getLogger(Application.class);

    @Resource(name = "ordersDataSource")
    private DataSource ordersDataSource;

    @Resource(name = "usersDataSource")
    private DataSource usersDataSource;

    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        // orders 数据源
        logger.info("[run][获得数据源:{}]", ordersDataSource.getClass());

        // users 数据源
        logger.info("[run][获得数据源:{}]", usersDataSource.getClass());
    }

}

执行日志如下:

2019-11-12 21:39:24.063  INFO 49670 --- [           main] c.i.s.lab19.datasourcepool.Application   : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
2019-11-12 21:39:24.064  INFO 49670 --- [           main] c.i.s.lab19.datasourcepool.Application   : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
2.5 监控功能

和2.4监控功能一致。

不过呢,我们在监控页面上,可以看到两个 Druid 数据库连接池。

你可能感兴趣的:(面试,学习路线,阿里巴巴,spring,boot,数据库,后端)