1. 程式人生 > >springBoot(八)整合之整合阿里druid資料庫連線池

springBoot(八)整合之整合阿里druid資料庫連線池

         當時是基於C3P0處理資料庫,然後偶發性出現連線超時,然後加上需要檢視連線次數以及訪問次數,我就想到採用druid資料庫連線池,話不多說,先上程式碼

其實下面的部分出於演示,用硬編碼,其實完全可以通過配置屬性,來進行動態改變,至於SpringCloud中的動態配置,其實也是通過重啟SpringBoot來達到充值屬性的效果,至於這部分,我之後會再說,這部分我也是看過某篇推文獲悉

目錄

配置監控器

4、測試:

配置資料庫源:

1、pom.xml

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- druid資料庫 -->
		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.11</version>
		</dependency>

2、application.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://*********************?allowMultiQueries=true&autoReconnect=true 
spring.datasource.username=admin
spring.datasource.password=admin
spring.datasource.driverClassName=com.mysql.jdbc.Driver
#dataSource Pool configuration
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000   
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.exceptionSorter=true
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
spring.datasource.useGlobalDataSourceStat=true

配置監控器

1、過濾不需要監控的字尾

/**  
 * 配置監控攔截器
 * druid監控攔截器  
 * @ClassName: DruidStatFilter   
 * @author CoffeeAndIce
 * @date 2017年7月24日 上午10:53:40  
 */  
@WebFilter(filterName="druidWebStatFilter",  
urlPatterns="/*",  
initParams={  
    @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略資源  
}) 
public class DruidStatFilter extends WebStatFilter {

}

有人想在這裡直接繼承StatFilter進行操作,但是這樣會導致重複匯入,導致無法執行,因為Druid之前已經有將其置入。

2、監控檢視配置

/**  
 * druid監控檢視配置  
 * @ClassName: DruidStatViewServlet   
 * @author CoffeeAndIce
 * @date 2017年7月24日 上午10:54:27  
 */  
@WebServlet(urlPatterns = "/druid/*", initParams={  
    @WebInitParam(name="allow",value=""),// IP白名單 (沒有配置或者為空,則允許所有訪問)  
    @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名單 (存在共同時,deny優先於allow)  
    @WebInitParam(name="loginUsername",value="admin"),// 使用者名稱  
    @WebInitParam(name="loginPassword",value="admin"),// 密碼  
    @WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能  
}) 
public class DruidStatViewServlet extends StatViewServlet {
	private static final long serialVersionUID = 2359758657306626394L;

}



如果僅僅這樣配置,我這邊不知道為什麼和網上的不一樣,我這邊是用MyBatis來做資料處理的,這邊就sql監控和sql防火牆監控都沒有用,當前使用的spring boot版本為1.4.x版本

然後搜尋了一番,資料來源決定自己處理

3、讀取連線屬性

 (這是之前的寫法)方式一

@Configuration  
public class DruidConfiguration {  
    @Value("${spring.datasource.url}")  
    private String dbUrl;  
    @Value("${spring.datasource.username}")  
    private String username;  
    @Value("${spring.datasource.password}")  
    private String password;  
    @Value("${spring.datasource.driverClassName}")  
    private String driverClassName;  
    @Value("${spring.datasource.initialSize}")  
    private int initialSize;  
    @Value("${spring.datasource.minIdle}")  
    private int minIdle;  
    @Value("${spring.datasource.maxActive}")  
    private int maxActive;  
    @Value("${spring.datasource.maxWait}")  
    private int maxWait;  
    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")  
    private int timeBetweenEvictionRunsMillis;  
    @Value("${spring.datasource.minEvictableIdleTimeMillis}")  
    private int minEvictableIdleTimeMillis;  
    @Value("${spring.datasource.validationQuery}")  
    private String validationQuery;  
    @Value("${spring.datasource.testWhileIdle}")  
    private boolean testWhileIdle;  
    @Value("${spring.datasource.testOnBorrow}")  
    private boolean testOnBorrow;  
    @Value("${spring.datasource.testOnReturn}")  
    private boolean testOnReturn;  
    @Value("${spring.datasource.poolPreparedStatements}")  
    private boolean poolPreparedStatements;  
    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")  
    private int maxPoolPreparedStatementPerConnectionSize;  
    @Value("${spring.datasource.filters}")  
    private String filters;  
    @Value("${spring.datasource.connectionProperties}")  
    private String connectionProperties;  
    @Value("${spring.datasource.useGlobalDataSourceStat}")  
    private boolean useGlobalDataSourceStat;  
  
    @Bean     //宣告其為Bean例項  
    @Primary  //在同樣的DataSource中,首先使用被標註的DataSource  
    public DataSource dataSource(){  
        DruidDataSource datasource = new DruidDataSource();  
        datasource.setUrl(this.dbUrl);  
        datasource.setUsername(username);  
        datasource.setPassword(password);  
        datasource.setDriverClassName(driverClassName);  
  
        //configuration  
        datasource.setInitialSize(initialSize);  
        datasource.setMinIdle(minIdle);  
        datasource.setMaxActive(maxActive);  
        datasource.setMaxWait(maxWait);  
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);  
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);  
        datasource.setValidationQuery(validationQuery);  
        datasource.setTestWhileIdle(testWhileIdle);  
        datasource.setTestOnBorrow(testOnBorrow);  
        datasource.setTestOnReturn(testOnReturn);  
        datasource.setPoolPreparedStatements(poolPreparedStatements);  
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);  
        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);  
        try {  
            datasource.setFilters(filters);  
        } catch (SQLException e) {  
            System.err.println("druid configuration initialization filter: "+ e);  
        }  
        datasource.setConnectionProperties(connectionProperties);  
        return datasource;  
    }  
}  

感謝讀者給出的建議,同時讓我學會了很多註解的應用玉機制,方式二

@SpringBootApplication
@ServletComponentScan//這行是為了避免掃描不到Druid的Servlet
public class WebBootApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebBootApplication.class, args);
    }


    /**
    *
    * 其實大家主要關心下面的就好
    */

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

}

4、測試:

連入 :http://localhost:8080/druid/login.html   

輸入(3.2、監控檢視配置)設定的密碼,終於看到夢寐以求的資料,這個問題可能是隻有這個版本才有或者有其他處理方法

注意:上面的這個類需要放到和application同級的目錄下,這樣才能在程式啟動的時候初始化DataSource
 

StatFilter拓展(用於統計監控資訊)

    SQL合併配置

         Tips: 在druid-0.2.17版本之後,sql合併支援tddl,能夠對分表進行合併。

當你程式中存在沒有引數化的sql執行時,sql統計的效果會不好。比如:
select * from t where id = 1
select * from t where id = 2
select * from t where id = 3


在統計中,顯示為3條sql,這不是我們希望要的效果。StatFilter提供合併的功能,能夠將這3個SQL合併為如下的SQL
select * from t where id = ?

spring.datasource.connectionProperties=druid.stat.mergeSql=true  屬性配置是這樣

  記錄慢SQL

   之前的版本 可能是true,現在為false

/**
 * @author wenshao [[email protected]]
 */
public class StatFilter extends FilterEventAdapter implements StatFilterMBean {

    private final static Log          LOG                        = LogFactory.getLog(StatFilter.class);

    private static final String       SYS_PROP_LOG_SLOW_SQL      = "druid.stat.logSlowSql";
    private static final String       SYS_PROP_SLOW_SQL_MILLIS   = "druid.stat.slowSqlMillis";
    private static final String       SYS_PROP_MERGE_SQL         = "druid.stat.mergeSql";

    public final static String        ATTR_NAME_CONNECTION_STAT  = "stat.conn";
    public final static String        ATTR_TRANSACTION           = "stat.tx";

    private final Lock                lock                       = new ReentrantLock();

    // protected JdbcDataSourceStat dataSourceStat;

    @Deprecated
    protected final JdbcStatementStat statementStat              = JdbcStatManager.getInstance().getStatementStat();

    @Deprecated
    protected final JdbcResultSetStat resultSetStat              = JdbcStatManager.getInstance().getResultSetStat();

    private boolean                   connectionStackTraceEnable = false;

    // 3 seconds is slow sql
    protected long                    slowSqlMillis              = 3 * 1000;

    protected boolean                 logSlowSql                 = false;

    private String                    dbType;

    private boolean                   mergeSql                   = false;

所以我們需要開啟的話:

spring.datasource.connectionProperties=druid.stat.logSlowSql=true;

預設時間是3秒,如需要設定自定義值: druid.stat.slowSqlMillis 加上你需要的毫秒數

多個Druid資料來源監控合併

    spring.datasource.useGlobalDataSourceStat=true

試中有其他問題或者解決方案,麻煩告知一下,共同進步,謝謝

配置防禦SQL注入攻擊

   開啟過濾器的在開頭已經給你開啟了:spring.datasource.filters=wall

只要你下載了原始碼,搜尋相應引數名:

  eg:  selelctAllow,你就會發現預設值

public class WallConfig implements WallConfigMBean {

    private boolean             noneBaseStatementAllow      = false;

    private boolean             callAllow                   = true;
    private boolean             selelctAllow                = true;
    private boolean             selectIntoAllow             = true;
    private boolean             selectIntoOutfileAllow      = false;
    private boolean             selectWhereAlwayTrueCheck   = true;
    private boolean             selectHavingAlwayTrueCheck  = true;
    private boolean             selectUnionCheck            = true;
    private boolean             selectMinusCheck            = true;
    private boolean             selectExceptCheck           = true;
    private boolean             selectIntersectCheck        = true;
    private boolean             createTableAllow            = true;
    private boolean             dropTableAllow              = true;
    private boolean             alterTableAllow             = true;

搜尋:configFromProperties,你就會發現,如果這樣還不會怎麼配置,對不起,無能為力

     Boolean propertyValue = getBoolean(properties, "druid.wall.selelctAllow");
            if (propertyValue != null) {
                this.setSelelctAllow(propertyValue);
            }

相關推薦

springBoot()整合整合阿里druid資料庫連線

         當時是基於C3P0處理資料庫,然後偶發性出現連線超時,然後加上需要檢視連線次數以及訪問次數,我就想到採用druid資料庫連線池,話不多說,先上程式碼 其實下面的部分出於演示,用硬編碼,其實完全可以通過配置屬性,來進行動態改變,至於SpringCloud

springboot 整合阿里 Druid 資料庫連線

一,Druid是什麼? Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 二, 在哪裡下載druid 三, 怎麼獲取Druid的原始碼 Druid是一個開源專案,原始碼託管在github上,原始碼倉庫

springmvc(五)整合阿里 druid資料庫連線和事務等配置,整合mybatis

感謝我們的小領導,他在研究,我們在套用,他走了以後再沒有完善過,一直沿用至今。如果看這裡的朋友有什麼需要整合進來的,不吝賜教,謝謝各位了。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:

阿里Druid資料庫連線配置解釋

#阿里資料庫連線池Druid配置 # 初始化連線大小 spring.datasource.druid.initial-size=20 # 最小空閒連線數 spring.datasource.druid.minIdle=20 # 最大連線數 spring.datasource.druid.maxAct

阿里DRUID資料庫連線配置

DRUID介紹     Druid是阿里實現的一個開源資料庫連線池,在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。同時Druid還提供了封裝的sql監控,u

引入阿里Druid資料庫連線(maven ssm框架)

Druid Druid是阿里巴巴開源平臺上的一個專案,整個專案由資料庫連線池、外掛框架和SQL解析器組成。該專案主要是為了擴充套件JDBC的一些限制,可以讓程式設計師實現一些特殊的需求,比如向金鑰服務請求憑證、統計SQL資訊、SQL效能收集、SQL注入檢查、S

Spring Boot 整合 Mybatis(druid 資料庫連線 以及 分頁配置)

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映,目前很大一部分網際網路、軟體公司都在使用這套框架 下來來之後,我們主要關注幾個檔案 配置檔案:generator.properties 主要是資料庫的相關配置,以及檔案生成的根路徑 generator.jdbc.drive

Spring學習總結(21)——Spring整合阿里巴巴資料庫連線DruidDataSource配置及其常見問題彙總

一、參考配置如下    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-          

MyBatis與Druid資料庫連線整合監控統計後WallFilterSQL注入異常問題處理方案

資料庫連線池使用的是阿里巴巴的Druid(德魯伊)。專案中啟用了Druid的統計管理,在執行批量修改時提示;Caused by: java.sql.SQLException: sql injection violation, multi-statement not allow

Springboot+druid資料庫連線使用

1. 為什麼要使用資料庫連線池        使用資料庫連線池主要考慮到程式與資料庫建立連線的效能。建立一個新的資料庫是一個很耗時的過程,在使用完之後,可能還需要不斷的釋放建立的連線,對資源的損耗大。        而採用資料庫連線池之後,首先就建立了固定數量的資料庫連線,需

Springboot 2.0選擇HikariCP作為預設資料庫連線的原因及與Druid的比較

摘要: 本文非原創,是筆者蒐集了一些HikariCP相關的資料整理給大家的介紹,主要講解了為什麼sb2選擇了HikariCP以及HikariCP為什麼這麼快。 Springboot2預設資料庫連線池選擇了HikariCP為何選擇HikariCP理由一、程式碼量理由二、口碑理

SpringBoot中配置使用Druid資料庫連線

Druid 是阿里巴巴開源的Java資料庫連線池外掛,Druid能夠提供強大的監控和擴充套件功能 配置使用Druid資料庫連線池 新增依賴 Gradle compile('com.alibaba:druid-spring-boot-sta

druid 資料庫連線的詳細配置

首先說一下自己程式中遇到的問題,前一段時間新寫了一個專案,主要架構改進,為前端提供介面(spring +springmvc+mybatis) 在新專案中使用的是阿里的druid連線池,配置簡單,除了資料庫地址,驅動類,使用者名稱和密碼其他一起都是預設,開始的時候由於專案更新上線頻率比較多,沒有出現太

MyBatis原始碼解析資料來源(含資料庫連線簡析)

一.概述: 常見的資料來源元件都實現了javax.sql.DataSource介面; MyBatis不但要能整合第三方的資料來源元件,自身也提供了資料來源的實現; 一般情況下,資料來源的初始化過程引數較多,比較複雜; 二.設計模式: 為什麼要使用工廠模式     資料來

測試druid資料庫連線併發遇到的問題

測試條件配置: 1:配置druid連線池最大數量為500(maxActive=500)。 2:測試併發量為1000。 報錯:Data source rejected establishment of connection,  message from server: "Too

基於Druid資料庫連線的資料來源配置,資料庫連線密碼加密解密

Druid的資料庫連線池配置。 <!-- 基於Druid資料庫連線池的資料來源配置 --> <bean id="dataSource" class="com.alibaba.drui

Druid資料庫連線問題,ERROR c.alibaba.druid.poo l.DruidDataSource

14:07:41.550 [Druid-ConnectionPool-Destroy-1326667259] ERROR c.alibaba.druid.poo l.DruidDataSource - abandon connection, owner thread: loc

Druid資料庫連線原始碼分析

Druid不僅僅是一個數據庫連線池,還有很多標籤,比如統計監控、過濾器、SQL解析等。既然要分析連線池,那先看看DruidDataSource類 getConnection方法的實現:   @Override public DruidPooledConne

Springboot 2.0選擇HikariCP作為預設資料庫連線的五大理由

轉載自公眾號:工匠小豬豬的技術世界 摘要: 本文 非原創 ,是筆者蒐集了一些HikariCP相關的資料整理給大家的介紹,主要講解了為什麼sb2選擇了HikariCP以及HikariCP為什麼這麼快。 Springboot2預設資料庫連線池選擇了HikariC

idea配置阿里Druid資料連線在SSM框架中使用

阿里Druid資料連線池在SSM框架中的配置使用 一、Druid資料連線池簡介 Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 效能好,同時自帶監控頁面,可以實時監控應用的連線池情況以及其中效能差的sql,方便我們找出應用中連線池方面的問題。