一、高級配置:druid數據源
1、Druid簡歷:
Druid首先是一個數據庫連接池。Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。Druid是阿里巴巴開發的號稱爲監控而生的數據庫連接池!
同時Druid不僅僅是一個數據庫連接池,它包括四個部分:
- Druid是一個JDBC組件;
- 基於Filter-Chain模式的插件體系;
- DruidDataSource 高效可管理的數據庫連接池;
- SQLParser。
2、Druid功能:
1、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
2、可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
3、數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行爲,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
4、SQL執行日誌,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
5、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。
簡單來說就是:
- 充當數據庫連接池;
- 可以監控數據庫訪問性能;
- 獲得SQL執行日誌。
3、Druid使用和配置:
- 首先在yml文件中配置Druid配置:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://47.97.192.241:3307/jdbcdata?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# schema:
# - classpath:sys_config.sql
# initialization-mode: always
# druid配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRrunMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置監控統計攔截的filters,
# 去掉後監控界面sql無法統計,‘wall’用於防火牆
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
注意這裏配置的時候,如果log4j不存在,你可以在pow中添加log4j依賴,也可以修改爲slf4j。但是這樣還是無法使用druid,我們來配置一下druid:
- 添加Druid配置文件:新建config.DruidConfig
package com.ogj.demojdbc.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid的監控
//1、配置一個管理後臺的servlet
@Bean
public ServletRegistrationBean StatViewServlet(){
ServletRegistrationBean bean=new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
Map<String,String> initParams=new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
initParams.put("allow",""); //默認運行所有訪問,可以設置localhost設置和ip
initParams.put("deny","192.168.42.199"); //拒絕訪問 設置訪問ip
bean.setInitParameters(initParams);
return bean;
}
//2、配置一個web監控的filter
@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;
}
}
對於servlet配置我們可以設置訪問後臺監控的:
- loginUsername
- loginPassword
- allow:允許哪些ip或者域名訪問
- deny:拒絕哪些ip或者域名訪問,我們這裏設置我們自己的ip,不能使用ip訪問監控。
對於Filter:
- 我們設置攔截器:攔截所有除了druid發出的所有請求:druid/*;
- 監視所有除了排除了的攔截請求;
我們可以來測試一下當前配置是否起效果:
package com.ogj.demojdbc;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootTest
class DemoJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
System.out.println("----------------");
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection.toString());
connection.close();
}
}
在test中進行測試當前配置:
如果配置成功,那麼會相應的加載同步的設置。
現在我們來開啓SpringBoot主類:
輸入我們剛剛設置的loginUsername和loginPassword進行登錄。
然後我們再用瀏覽器來發出一個查詢數據的請求:
我們再來看是否監測到:
我們可以看到,已經監測到了該次請求,並且我們還能看到該次請求的sql語句:
我們也可以看到請求的數據源:
Druid的基礎學習就在這裏結束啦,不得不說,這一套後臺監測系統,阿里還是很牛批的,阿里無敵!