SpringBoot(八)——————SpringBoot整合Druid數據源

源碼地址:https://github.com/877148107/springboot_integrate

Druid源碼地址:https://github.com/alibaba/druid/

Druid常見使用問題:https://github.com/alibaba/druid/wiki/常見問題

  • Druid是什麼?

Druid是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。

  • SpringBoot數據源自動配置DataSourceAutoConfiguration

1)、DataSourceConfiguration

根據配置文件的配置創建數據源,默認使用HikariDataSource。可以使用spring.datasource.type來指定數據源類型

2)、DataSourceInitializerInvoker(ApplicationListener)

/**
 * Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on
 * {@link InitializingBean#afterPropertiesSet()} and {@literal data-*.sql} SQL scripts on
 * a {@link DataSourceSchemaCreatedEvent}.
 *
 * @author Stephane Nicoll
 * @see DataSourceAutoConfiguration
 */
class DataSourceInitializerInvoker implements ApplicationListener<DataSourceSchemaCreatedEvent>, InitializingBean {

1、 DataSourceInitializer->runScripts運行建表語句和插入數據語句,默認只需要將文件名稱設置爲schema-*.sql、data-*.sql

2、DataSourceInitializer->getScript獲取建表語句或者插入語句的文件

3、可以自己指定schema文件

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.0.113:3306/Mybatis
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      schema:
        - classpath:table.sql
        - classpath:data.sql

4、JdbcTemplateAutoConfiguration自動配置了JdbcTemplate,直接注入使用

項目下的sql文件不執行,需要設置DataSourceInitializationMode模式(ALWAYS,EMBEDDED,NEVER),默認是EMBEDDED

public enum DataSourceInitializationMode {
    ALWAYS,
    EMBEDDED,
    NEVER;

    private DataSourceInitializationMode() {
    }
}


class DataSourceInitializer {
	void initSchema() {
		List<Resource> scripts = getScripts("spring.datasource.data", this.properties.getData(), "data");
		if (!scripts.isEmpty()) {
			if (!isEnabled()) {
				logger.debug("Initialization disabled (not running data scripts)");
				return;
			}
			String username = this.properties.getDataUsername();
			String password = this.properties.getDataPassword();
			runScripts(scripts, username, password);
		}
	}

	private boolean isEnabled() {
		DataSourceInitializationMode mode = this.properties.getInitializationMode();
		if (mode == DataSourceInitializationMode.NEVER) {
			return false;
		}
		if (mode == DataSourceInitializationMode.EMBEDDED && !isEmbedded()) {
			return false;
		}
		return true;
	}
}
  • SpringBoot整合Druid數據源

1)、添加依賴

<!--引入阿里數據源druid-->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.9</version>
</dependency>    

2)、指定數據源及配置相關屬性

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.0.113:3306/Mybatis
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #   數據源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #   配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

很多屬性在druid的數據源屬性和配置文件的數據沒有對應起來需要自己寫一個配置文件將對應的數據源和配置文件綁定

@Configuration
public class MyDruidConfig {

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

肯定出現錯誤信息如下,根據提示配置文件中配置了filters: stat,wall,log4j,那麼這個配置只有log4j不存,,只需要導入其中一個依賴jar即可

Failed to bind properties under 'spring.datasource' to com.alibaba.druid.pool.DruidDataSource:

    Property: spring.datasource.filters
    Value: stat,wall,log4j
    Origin: class path resource [application.yml]:19:14
    Reason: org.apache.log4j.Priority
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.16</version>
	<scope>compile</scope>
</dependency>

3)、配置數據源監控

@Configuration
public class MyDruidConfig {

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

    /**配置Druid數據源監控**/
    /**
     * 配置後臺管理的Servlet
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        Map<String,Object> param = new HashMap<>();
        param.put("loginUsername","admin");
        param.put("loginPassword","123456");
        param.put("allow","");


        bean.setInitParameters(param);
        return bean;
    }

    /**
     * 配置web監控的filte
     * @return
     */
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map<String,Object> param = new HashMap<>();
        param.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(param);
        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }
}

效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章