天天看點

durid

durid設計思路

資源池(resource pool)。該模式正是為了解決資源的頻繁配置設定﹑釋放所造成的問題。為解決上述問題,可以采用資料庫連接配接池技術。資料庫連接配接池的基本思想就是為資料庫連接配接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接配接,當需要建立資料庫連接配接時,隻需從“緩沖池”中取出一個,使用完畢之後再放回去。我們可以通過設定連接配接池最大連接配接數來防止系統無盡的與資料庫連接配接。更為重要的是我們可以通過連接配接池的管理機制監視資料庫的連接配接的數量﹑使用情況,為系統開發﹑測試及性能調整提供依據。

durid

.

連接配接池的配置設定與釋放

連接配接池的配置設定與釋放,對系統的性能有很大的影響。合理的配置設定與釋放,可以提高連接配接的複用度,進而降低建立新連接配接的開銷,同時還可以加快使用者的通路速度。

對于連接配接的管理可使用空閑池。即把已經建立但尚未配置設定出去的連接配接按建立時間存放到一個空閑池中。每當使用者請求一個連接配接時,系統首先檢查空閑池内有沒有空閑連接配接。如果有就把建立時間最長(通過容器的順序存放實作)的那個連接配接配置設定給他(實際是先做連接配接是否有效的判斷,如果可用就配置設定給使用者,如不可用就把這個連接配接從空閑池删掉,重新檢測空閑池是否還有連接配接);如果沒有則檢查目前所開連接配接池是否達到連接配接池所允許的最大連接配接數(maxconn)如果沒有達到,就建立一個連接配接,如果已經達到,就等待一定的時間(timeout)。如果在等待的時間内有連接配接被釋放出來就可以把這個連接配接配置設定給等待的使用者,如果等待時間超過預定時間timeout 則傳回空值(null)。系統對已經配置設定出去正在使用的連接配接隻做計數,當使用完後再返還給空閑池。對于空閑連接配接的狀态,可開辟專門的線程定時檢測,這樣會花費一定的系統開銷,但可以保證較快的響應速度。也可采取不開辟專門線程,隻是在配置設定前檢測的方法

代碼實作

yml代碼段

datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/shares?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    filters: stat,wall

    initialSize: 5
    minIdle: 5
    maxActive: 20

    maxWait: 60000

    timeBetweenEvictionRunsMillis: 60000

    minEvictableIdleTimeMillis: 300000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false

    poolPreparedStatements: false
    maxPoolPreparedStatementPerConnectionSize: 20

    connectionProperties:
      druid:
        stat:
          mergeSql: true
          slowSqlMillis: 5000
           

durid實作

@Configuration
@PropertySource(value = "classpath:/application.yml")
public class DruidConfiguration {

    /**
     * @author zzx
     * @date 2018-10-15 11:28
     * @todo 資料源配置
     */
    @Bean(destroyMethod = "close", initMethod = "init")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }

    /**
     * druid
     * 注冊一個StatViewServlet
     * @return
     */
    @Bean
    public ServletRegistrationBean druidStatViewServlet(){
        //org.springframework.boot.context.embedded.ServletRegistrationBean提供類的進行注冊.
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

        //添加初始化參數:initParams
        //白名單:
        servletRegistrationBean.addInitParameter("allow","*");
        //IP黑名單 (存在共同時,deny優先于allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        //servletRegistrationBean.addInitParameter("deny","192.168.1.73");
        //登入檢視資訊的賬号密碼.
        servletRegistrationBean.addInitParameter("loginUsername","admin");
        servletRegistrationBean.addInitParameter("loginPassword","123456");
        //是否能夠重置資料.
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    }

    /**
     * druid過濾器
     * 注冊一個:filterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean druidStatFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加過濾規則.
        filterRegistrationBean.addUrlPatterns("/*");
        //添加不需要忽略的格式資訊.
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

}