Springboot 2.x 使用 Druid 數據源


一、Druid 數據源

訪問Druid github 官方地址: https://github.com/alibaba/druid 

拖到最后,可以找到 Druid 使用的相關文檔

 

二、如何使用 Druid 數據源

2.1、引入 Maven 依賴

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.21</version>
</dependency>

2.2、自定義配置類,並且往容器中注入 DruidDataSource 組件

@Configuration
public class DruidConfig {
    
    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource druid = new DruidDataSource();
        druid.setUsername("root");
        druid.setPassword("root");
        druid.setUrl("jdbc:mysql://localhost:3306/jdbcdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
        druid.setDriverClassName("com.mysql.cj.jdbc.Driver");

        return druid;
    }
}

2.3、測試類

@SpringBootTest
class DatasourceApplicationTests {
    // 更換為 Druid 數據源
    @Autowired
    DataSource dataSource;
    // 默認配置了 JdbcTemplate
    @Autowired
    JdbcTemplate jt;

    @Test
    void contextLoads() {
        System.out.println("現在的數據源是: " + dataSource.getClass());
        System.out.println("默認配置了: " + jt.getClass());
        List<Map<String, Object>> maps = jt.queryForList("select * from user");
        System.out.println(maps);
    }
}

2.4、測試結果

從上面的例子中我們發現,我們並未在 application.properties 中配置任何信息,為什么新加入的數據源就起效了呢?

 

三、Druid 配置原理

我們在 Springboot 的 DataSourceAutoConfiguration 類中可以看到如下聲明

也就是只要我向 IOC 容器中注入了 DataSource ,那么 Springboot 就不會再導入 Hikari、Tomcat 等數據源,並且它會從容器中找到 DataSource ,然后使用該數據源.

從上面的數據源配置類中看到,一個數據源能設置的屬性還是非常多的,如果都寫在代碼里面,會讓整個代碼顯得很臃腫,並且如果我們需要修改某一個屬性的值時,必須要改動代碼才有效,這樣就很不合理,那么怎么改進呢?我們可以將其寫入 application.properties 中,只需要使用 @ConfigurationProperties注解就可以了

// 配置類
@Configuration
public class DruidConfig {

    @Bean
	// 將 application.properties 中以 spring.dataSource 開頭的配置項的值賦值給 DruidDataSource 中對應的屬性
	// 例如 spring.datasource.username=root 就等價於給 dataSource 這個對象的 username 屬性賦值
    @ConfigurationProperties(prefix="spring.datasource")
    public DruidDataSource dataSource() {
        DruidDataSource druid = new DruidDataSource();
        return druid;
    }
}

// application.properties 配置文件內容
# 用戶名
spring.datasource.username=root
# 密碼
spring.datasource.password=root
# mysql 數據庫 URL
spring.datasource.url=jdbc:mysql://localhost:3306/jdbcdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
# mysql 驅動 (mysql 8.x 版本的使用 com.mysql.cj.jdbc.Driver
# 5.x 版本的使用的是 com.mysql.jdbc.Driver
# 使用 spring.datasource.driver-class-name 也是一樣的,點擊這個屬性,會跳到同一個位置
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

# 進行數據庫鏈接池的配置,數據庫最小維持連接數
spring.datasource.dbcp2.min-idle=1
# 數據庫初始化提供的連接數
spring.datasource.dbcp2.initial-size=1
# 數據庫最大維持連接數
spring.datasource.dbcp2.max-total=1
# 等待連接獲取的最大超時時間

注意:我這里的 application.properties 中並沒有使用 spring.datasource.type 來指定數據源的類型,因為數據源是我們手動注入到 IOC 容器中的,如果是 starter 方式引入 Druid 數據源,則需要該屬性來指定

# 配置當前要使用的數據源的操作類型
# spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

  

四、開啟 Druid 監控相關的功能

具體可以參考: https://github.com/alibaba/druid/wiki/常見問題

按照自己的需求來配置對應的功能

例如下面的配置

@Configuration
public class DruidConfig {

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

    @Bean
    // Druid 內置提供了一個 StatViewServlet 用於展示 Druid 的統計信息
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*");

        HashMap<String, Object> map = new HashMap<>();
        map.put("loginUsername", "admin");
        map.put("loginPassword", "admin");
        //map.put("resetEnable", true);
        map.put("allow", "");
        servletRegistrationBean.setInitParameters(map);
        return servletRegistrationBean;
    }

    //2、配置一個 web 監控的 filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

配置完成之后,瀏覽器訪問: http://localhost:8080/druid/

便會來到登錄頁面,輸入我們配置的 用戶名/密碼

Sign in 登錄跳轉到主頁

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM