springBoot(八)整合之整合阿里druid資料庫連線池
當時是基於C3P0處理資料庫,然後偶發性出現連線超時,然後加上需要檢視連線次數以及訪問次數,我就想到採用druid資料庫連線池,話不多說,先上程式碼
其實下面的部分出於演示,用硬編碼,其實完全可以通過配置屬性,來進行動態改變,至於SpringCloud中的動態配置,其實也是通過重啟SpringBoot來達到充值屬性的效果,至於這部分,我之後會再說,這部分我也是看過某篇推文獲悉
目錄
配置資料庫源:
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,方便我們找出應用中連線池方面的問題。