Druid 的整合

       Java 中經常使用的數據庫鏈接池有 C3P0、Hikari、Druid 等。數據庫的鏈接池,對於整個項目的性能仍是很關鍵的,所以全部的 Java 項目當中都會使用數據庫鏈接池。在 Java 的各類數據庫鏈接池中,Druid 是阿里巴巴推出的開源的、號稱最好用數據庫鏈接池,它提供了強大的監控和擴展功能。Druid 在 github 的地址以下:css

https://github.com/alibaba/druid/wiki/常見問題java

 

       本次來整理一下關於 Spring 和 Druid 的整合。mysql

 

建立 SpringBoot 項目git

       在整合 Druid 以前,須要先建立一個 SpringBoot 和 MyBatis 的項目,先來觀察一下,它默認是否使用了數據庫鏈接池,使用了什麼數據庫鏈接池。而後,再來整合 Druid 這款數據庫鏈接池到項目當中。github

 

       建立 SpringBoot 和 Mybatis 的項目很簡單,經過嚮導便可完成。建立項目後的依賴以下:web

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

       其中的依賴不多,添加了 SpringMVC、Mybatis 和 MySQL。有了依賴以後,添加數據庫的配置,不然項目沒法啓動。數據庫的配置以下:spring

spring:
    datasource:
        url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
        username: root
        password:

       有了上面的配置,項目就能夠啓動了,不過整個項目沒有任何功能啓動也無心義。所以來寫一個簡單的單元測試,代碼以下:sql

@Autowired
DataSource dataSource;

@Test
void contextLoads() throws SQLException
{
    System.out.println(dataSource.getClass());
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
}
       有了單元測試以後,直接運行單元測試的代碼,輸出結果以下:
class com.zaxxer.hikari.HikariDataSource
2020-10-02 11:17:41.279  INFO 25817 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-10-02 11:17:41.457  INFO 25817 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
HikariProxyConnection@1405548909 wrapping com.mysql.cj.jdbc.ConnectionImpl@435cc7f9
2020-10-02 11:17:41.472  INFO 25817 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-10-02 11:17:41.482  INFO 25817 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

       能夠看到,雖然在項目中沒有整合任何的數據庫鏈接池,可是 Spring 默認整合了 Hikari 這個數據庫鏈接池。可是,咱們想要使用的是 Druid,那麼該如何作?數據庫

 

整合 Druidmybatis

        整合 Druid 的方法也比較簡單的,引入 Druid 的相關依賴,並修改數據庫的配置便可。依賴以下:

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.24</version>
</dependency>

       修改數據庫的配置只須要增長一行配置便可,配置以下:

spring:
    datasource:
        url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
        username: root
        password:
        type: com.alibaba.druid.pool.DruidDataSource

       比較前面的配置,咱們的配置增長了一行配置,而後咱們接着運行前面的單元測試代碼。輸出以下:

class com.alibaba.druid.pool.DruidDataSource
2020-10-02 12:01:18.784  INFO 26316 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@3f0d6038
2020-10-02 12:01:18.920  INFO 26316 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2020-10-02 12:01:18.921  INFO 26316 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
2020-10-02 12:01:18.922  INFO 26316 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

        能夠看到,數據庫鏈接池已經變成了 alibaba 的 Druid 了。

       固然了,這不能算完,由於數據庫鏈接池仍是有不少配置的,咱們添加一些配置,配置以下:

spring:
    datasource:
        url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
        username: root
        password:
        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

        上面的配置對 Druid 進行相關的配置,可是添加上配置是否能生效,修改咱們的單元測試代碼並運行,單元測試代碼修改以下:

DruidDataSource druidDataSource = (DruidDataSource)dataSource;
System.out.println("initialSize: " + druidDataSource.getInitialSize());
System.out.println("maxActive: " + druidDataSource.getMaxActive());

       運行修改後的單元測試,查看輸出:

initialSize: 0
maxActive: 8

       能夠看到,並無按照咱們的預期進行輸出,由於配置並無被讀取。咱們須要可以將修改的配置進行讀取。

 

讀取數據庫鏈接池配置

        想要使用數據庫鏈接池的配置,那麼就須要定義一個讀取配置的類,並從新實例化一個 DataSource 類。代碼以下:

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

       再次運行單元測試,查看輸出:

initialSize: 5
maxActive: 20

        能夠看到,如今的輸出結果已經和配置相同了。

 

配置監控

        在前面已經提到過,Druid 有強大的監控功能,可是須要咱們進行簡單的代碼編寫才能夠進行查看具體的監控,代碼以下;

@Bean
public ServletRegistrationBean druidServletRegistrationBean()
{
    ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");;
    Map<String, String> initParam = new HashMap<>();
    //後臺容許誰能夠訪問
    initParam.put("loginUsername", "admin");
    initParam.put("loginPassword", "123456");
    initParam.put("allow", "");
    servletServletRegistrationBean.setInitParameters(initParam);

    return servletServletRegistrationBean;
}

// 配置 Druid 監控 之  web 監控的 filter
// WebStatFilter:用於配置Web和Druid數據源之間的管理關聯監控統計
@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;
}

       啓動項目,而後訪問 localhost:8080/druid/ 就會進入 Druid 的監控界面,界面以下:

 

       到此 Spring 整合 Druid 就完成了。

 

 

相關文章
相關標籤/搜索