Spring Boot 使用Druid連接池整合Mybatis-Plus連接Mysql數(shù)據(jù)庫(kù)

一、連接池

在普通的數(shù)據(jù)庫(kù)訪問程序中,客戶程序得到的連接對(duì)象是物理連接,調(diào)用連接對(duì)象的close()方法將關(guān)閉連接,而采用連接池技術(shù),客戶程序得到的連接對(duì)象是連接池中物理連接的一個(gè)句柄,調(diào)用連接對(duì)象的close()方法,物理連接并沒有關(guān)閉,數(shù)據(jù)源的實(shí)現(xiàn)只是刪除了客戶程序中的連接對(duì)象和池中的連接對(duì)象之間的聯(lián)系。

二、連接池框架比較

目前常用的連接池框架主要有c3p0、dbcp、proxool、druid。Spring 推薦使用dbcp;Hibernate 推薦使用c3p0和proxool

1、 DBCP:apache
DBCP(DataBase connection pool)數(shù)據(jù)庫(kù)連接池。是apache上的一個(gè) java連接池項(xiàng)目,也是 tomcat使用的連接池組件。單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數(shù)據(jù)庫(kù)連接是一個(gè)非常耗時(shí)耗資源的行為,所以通過連接池預(yù)先同數(shù)據(jù)庫(kù)建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫(kù)連接時(shí)直接到連接池中申請(qǐng)一個(gè)就行,用完后再放回去。dbcp沒有自動(dòng)的去回收空閑連接的功能。

2、 C3P0:
C3P0是一個(gè)開源的jdbc連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和jndi綁定,支持jdbc3規(guī)范和jdbc2的標(biāo)準(zhǔn)擴(kuò)展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能。目前使用它的開源項(xiàng)目有Hibernate,Spring等。c3p0有自動(dòng)回收空閑連接功能。

3、 Proxool:Sourceforge
Proxool是一種Java數(shù)據(jù)庫(kù)連接池技術(shù)。是sourceforge下的一個(gè)開源項(xiàng)目,這個(gè)項(xiàng)目提供一個(gè)健壯、易用的連接池,最為關(guān)鍵的是這個(gè)連接池提供監(jiān)控的功能,方便易用,便于發(fā)現(xiàn)連接泄漏的情況。
綜合來說,穩(wěn)定性是dbcp>=c3p0>proxool

后來阿里巴巴的Druid開源了,Druid首先是一個(gè)數(shù)據(jù)庫(kù)連接池,但它不僅僅是一個(gè)數(shù)據(jù)庫(kù)連接池,它還包含一個(gè)ProxyDriver,一系列內(nèi)置的JDBC組件庫(kù),一個(gè)SQLParser。Druid支持所有JDBC兼容的數(shù)據(jù)庫(kù),包括Oracle、MySql、Derby、Postgresql、SQLServer、H2等等。

Druid針對(duì)Oracle和MySql做了特別優(yōu)化,比如Oracle的PSCache內(nèi)存占用優(yōu)化,MySql的ping檢測(cè)優(yōu)化。Druid在監(jiān)控、可擴(kuò)展性、穩(wěn)定性和性能方面都有明顯的優(yōu)勢(shì)。Druid提供了Filter-Chain模式的擴(kuò)展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監(jiān)控、SQL審計(jì)、用戶名密碼加密、日志等等。

三、在Spring Boot中加入Druid連接池

3.1 添加druid依賴
compile group: 'com.alibaba', name: 'druid', version: '1.1.17'
3.2 修改application.yml配置文件
spring:
  ########-spring datasource-########
  datasource:
     #賬號(hào)配置
     url: jdbc:mysql://127.0.0.1:3306/retail_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: test
     password: test
     driver-class-name: com.mysql.cj.jdbc.Driver

     #druid連接池配置
     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
     maxPoolPreparedStatementPerConnectionSize: 20
     filters: stat,wall,log4j
     connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
3.3 DruidConfiguration 配置類
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 * @author Alan Chen
 * @description Druid連接池監(jiān)控平臺(tái) http://localhost:8080/druid/index.html
 * @date 2019/6/4
 */
@Configuration
public class DruidConfiguration {

    @Bean
    public ServletRegistrationBean startViewServlet(){
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        // IP白名單
        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        // IP黑名單(共同存在時(shí),deny優(yōu)先于allow)
        servletRegistrationBean.addInitParameter("deny","127.0.0.1");
        //控制臺(tái)管理用戶
        servletRegistrationBean.addInitParameter("loginUsername","admin");
        servletRegistrationBean.addInitParameter("loginPassword","123456");
        //是否能夠重置數(shù)據(jù)
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean statFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加過濾規(guī)則
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略過濾的格式
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}
3.4 啟動(dòng)服務(wù),登錄Druid連接池監(jiān)控平臺(tái)

http://localhost:8080/druid/index.html

Druid連接池監(jiān)控平臺(tái)

參考文章:
連接池的意義及阿里Druid

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容