一 Druid 資料源是什麼
Druid 是 Java 語言中最好的資料庫連接配接池,是阿裡巴巴的一個開源項目,作為一個優秀的資料庫連接配接池,Druid 提供了優秀的穩定性,并且在性能方面比其他資料庫連接配接提高了很多,最重要的是Druid 提供了實時監控功能,如資料源監控、SQL 監控、SQL 防火牆、Web 應用監控、URI 監控、Session 監控、Spring 監控等。正如Druid官網(http://druid.io/)介紹的那樣:Druid主要用于存儲、查詢和分析大型事件流。
總結:優秀
二 如何整合 Druid 資料源
2.1 引入依賴
<!-- jdbcTemplate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- druid資料庫連接配接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
</dependency>
2.2 Druid 參數配置
application.properties 檔案添加如下配置:
#資料庫設定
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/account
spring.datasource.username=root
spring.datasource.password=root
#--------------------------
# 下面為連接配接池的補充設定,應用到上面所有資料源中
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=1
spring.datasource.maxActive=50
# 配置擷取連接配接等待逾時的時間
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.testOnReturn=false
# 打開PSCache,并且指定每個連接配接上PSCache的大小
spring.datasource.poolPreparedStatements=false
#spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監控資料
#spring.datasource.useGlobalDataSourceStat=true
2.3 Druid Datasource 執行個體化
package com.sb.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 org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
@PropertySource(value = "classpath:application.properties")
public class DruidConfiguration {
@Bean(destroyMethod = "close", initMethod = "init")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
/**
* 注冊一個StatViewServlet
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initParameters = new HashMap<String, String>();
initParameters.put("loginUsername", "admin");//屬性見:com.alibaba.druid.support.http.ResourceServlet
initParameters.put("loginPassword", "123456");
initParameters.put("allow", "");//預設允許所有
initParameters.put("deny", "");
bean.setInitParameters(initParameters);
return bean;
}
/**
* 配置一個web監控的filter
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean filterBean = new FilterRegistrationBean();
filterBean.setFilter(new WebStatFilter());
filterBean.setUrlPatterns(Arrays.asList("/*"));
Map<String, String> initParameters = new HashMap<String, String>();
initParameters.put("exclusions", "*.js,*.css,/druid/*");//屬性見:com.alibaba.druid.support.http.WebStatFilter
filterBean.setInitParameters(initParameters);
return filterBean;
}
}
2.4 測試
package com.sb.controller;
import com.sb.dto.RetDTO;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping
public class TestController {
@Resource
private JdbcTemplate jdbcTemplate;
@RequestMapping("/getUserList")
public RetDTO<List<Map<String, Object>>> getUserList() {
List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT id,name,age,create_datetime,update_datetime FROM user ", new Object[]{});
return RetDTO.getReturnJson(list);
}
}
通路 localhost:8080/getUserList
{
"code": 200,
"msg": "OK",
"data": [
{
"id": 1,
"name": "張三",
"age": 18,
"create_datetime": "2019-09-10T00:27:48.000+0000",
"update_datetime": "2019-09-10T00:27:48.000+0000"
},
{
"id": 2,
"name": "李四",
"age": 20,
"create_datetime": "2019-09-10T00:27:48.000+0000",
"update_datetime": "2019-09-10T00:27:48.000+0000"
},
{
"id": 3,
"name": "王五",
"age": 19,
"create_datetime": "2019-09-10T00:27:48.000+0000",
"update_datetime": "2019-09-10T00:27:48.000+0000"
}
],
"desc": null
}
2.5 監控
通路 http://localhost:8080/druid, 使用上面配置的賬号密碼(admin/123456)。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csEDbHJGezJTWoBnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5kjMyEzNxMTMyATMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)