zoukankan      html  css  js  c++  java
  • Spring Boot (14) 数据源配置原理

    数据源配置源码

      这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hikari连接池如何自动配置切换,其他数据源配置也是一样的原理

        ...
        //Tomcat数据源配置-如果当前环境中加载了括号里面的class,注解条件成立,系统将会加载被注解的内容
        @ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})
    //如果在properties中配置了spring.datasource.type=org.apache.tomcat.jdbc.poll.DataSource则条件成立 matchIfMissing=true 如果没有配置这个参数,默认条件成立 @ConditionalOnProperty( name
    = {"spring.datasource.type"}, havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true )
    //上面两个条件都成立,系统会加载Tomcat数据源配置
    static class Tomcat extends DataSourceConfiguration { Tomcat() { } //将方法返回的bean 注入spring @Bean
    //将properties文件中以spring.datasource.tomcat开头的属性值注入到方法返回的bean(tomcat连接池) @ConfigurationProperties(
    "spring.datasource.tomcat") public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) { org.apache.tomcat.jdbc.pool.DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)this.createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class); DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } ...

    Hikari数据源配置,注解意思同上

        @ConditionalOnClass({HikariDataSource.class})
        @ConditionalOnProperty(
            name = {"spring.datasource.type"},
            havingValue = "com.zaxxer.hikari.HikariDataSource",
            matchIfMissing = true
        )
        static class Hikari extends DataSourceConfiguration {
            Hikari() {
            }
    
            @Bean
            @ConfigurationProperties("spring.datasource.hikari")
            public HikariDataSource dataSource(DataSourceProperties properties) {
                return (HikariDataSource)this.createDataSource(properties, HikariDataSource.class);
            }
        }

    默认tomcat连接池

      只要在spring boot中添加了jdbc组建,就会自动加载tomcat连接池的class。从源码中可以看出,默认会加载tomcat连接池。

    配置Hikari连接池

      Hikari连接池是当前最好的连接池,可以参考官方测试数据。

    1.spring boot默认没有Hikari的class,需要在pom.xml中添加依赖,Hikari的第一个注解条件才会成立

            <!--Hikari连接池 -->
            <dependency>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP</artifactId>
            </dependency>

    2.application.yml中配置,会造成tomcat连接池第二个注解条件不成立,并使Hikari的第二个注解条件成立

    spring:
      datasource:
        type: com.zaxxer.hikari.HikariDataSource

    如果不配置datasource.type属性,spring boot会按照它的顺序进行加载,加载了一个 已经有了就不会再注入后面的连接池了。

    druid

      druid连接池可能在国外不流行,在spring boot并没有其相关源码,不过只要添加了druid组建依赖,会优先配置druid连接池,就不会再加载本篇的所有配置,这是在druid组件中自动实现的。

    查看当前数据库

      如果要验证当前运行的数据源到底是哪一个,可以在控制层用以下方法查看

        @Resource
        javax.sql.DataSource dataSource;
        @RequestMapping("/")
        public void test() {
            System.out.println(dataSource.getClass());
        }

    class com.alibaba.druid.pool.DruidDataSource

  • 相关阅读:
    CentOS 6.4 x64 zabbix 2.2.2 编译安装
    Monitorix 监控 安装配置
    CentOS 6.4 x64 Percona-Server-5.6.15 源码安装
    CentOS 6.4 x64 安装 配置 Redmine 2.4.1
    ActiviMQ的基本使用
    Java内存 模型理解
    线程池的两种创建方式及区别
    线程创建的三种方式及区别
    Spring cloud 之Ribbon(二)负载均衡原理
    Spring cloud 之Ribbon(一)基本使用
  • 原文地址:https://www.cnblogs.com/baidawei/p/9110948.html
Copyright © 2011-2022 走看看