- 依赖
//mysql 驱动
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.21'
//druid
compile group: 'com.alibaba', name: 'druid', version: '1.1.10'
# 1. 新建druid配置信息类DruidConfiguration.java
package com.futao.springmvcdemo.foundation.configuration;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* @author futao
* Created on 2018/10/11.
* ConfigurationProperties(prefix = "spring.datasource")使用规则,注入的字段如果为private,则必须具有setter方法
*/
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidConfiguration {
/**
* 数据库地址
*/
private String url;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
/**
* 初始化连接数量
*/
private int initialSize;
/**
* 最小闲置连接
*/
private int minIdle;
/**
* 最大存活连接
*/
private int maxActive;
/**
* 配置获取连接等待超时的时间
*/
private long maxWait;
/**
* 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
*/
private long timeBetweenEvictionRunsMillis;
/**
* 配置一个连接在池中最小生存的时间,单位是毫秒
*/
private long minEvictableIdleTimeMillis;
/**
* 配置一个连接在池中最大生存的时间,单位是毫秒
*/
private long maxEvictableIdleTimeMillis;
/**
*
*/
private boolean testWhileIdle;
/**
*
*/
private boolean testOnBorrow;
/**
*
*/
private boolean testOnReturn;
/**
*
*/
private boolean poolPreparedStatements;
/**
*
*/
private int maxOpenPreparedStatements;
/**
*
*/
private boolean asyncInit;
@Bean
public DataSource druidDataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(password);
druidDataSource.setMaxActive(maxActive);
druidDataSource.setInitialSize(initialSize);
druidDataSource.setMaxWait(maxWait);
druidDataSource.setMinIdle(minIdle);
druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
druidDataSource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
druidDataSource.setTestWhileIdle(testWhileIdle);
druidDataSource.setTestOnBorrow(testOnBorrow);
druidDataSource.setTestOnReturn(testOnReturn);
druidDataSource.setPoolPreparedStatements(poolPreparedStatements);
druidDataSource.setMaxOpenPreparedStatements(maxOpenPreparedStatements);
druidDataSource.setAsyncInit(asyncInit);
return druidDataSource;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public long getMaxWait() {
return maxWait;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public long getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public long getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public long getMaxEvictableIdleTimeMillis() {
return maxEvictableIdleTimeMillis;
}
public void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis) {
this.maxEvictableIdleTimeMillis = maxEvictableIdleTimeMillis;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxOpenPreparedStatements() {
return maxOpenPreparedStatements;
}
public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) {
this.maxOpenPreparedStatements = maxOpenPreparedStatements;
}
public boolean isAsyncInit() {
return asyncInit;
}
public void setAsyncInit(boolean asyncInit) {
this.asyncInit = asyncInit;
}
}
# 2. 在application.yml中配置配置信息
spring:
# 数据源
datasource:
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
platform: mysql
initialSize: 5
minIdle: 10
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 2000
minEvictableIdleTimeMillis: 600000
maxEvictableIdleTimeMillis: 900000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
asyncInit: true
filters: stat,wall,log4j
logSlowSql: true
# 3. 添加过滤器DruidFilter.java
druid除了数据连接池,还集成了对站点的URL进行统计的功能,利用filter忽略druid对某些资源的统计
package com.futao.springmvcdemo.controller;
import com.alibaba.druid.support.http.WebStatFilter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
/**
* @author futao
* Created on 2018/10/11.
*/
@WebFilter(filterName = "DruidFilter", urlPatterns = "/*", initParams = {
@WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
})
public class DruidFilter extends WebStatFilter {
}
# 4. 定义DruidServlet.java
显示druid管理页面
package com.futao.springmvcdemo.controller;
import com.alibaba.druid.support.http.StatViewServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
* @author futao
* Created on 2018/10/11.
*/
@WebServlet(urlPatterns = "/druid/*",
initParams = {
@WebInitParam(name = "allow", value = "127.0.0.1"),// 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 = "false")// 禁用HTML页面上的“Reset All”功能
})
public class DruidServlet extends StatViewServlet {
private static final long serialVersionUID = -6085007333934055609L;
}
# 5. 对于基于注解的Filter和Servlet需要在SpringBoot的启动类上打上自动扫描注解@@ServletComponentScan
package com.futao.springmvcdemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
/**
* @author futao
* ServletComponentScan 开启servlet和filter
*/
@SpringBootApplication
@ServletComponentScan
@MapperScan("com.futao.springmvcdemo.dao")
//@EnableAspectJAutoProxy
public class SpringmvcdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringmvcdemoApplication.class, args);
}
}
# 截一波运行图
# 坑
- sql监控页面没有数据:
检查是否配置了filters - 数据源页面显示
(*)druid property for user to setup
,未关闭数据源,加上destroyMethod
@Bean(destroyMethod = "close", initMethod = "init")
public DataSource druidDataSource() throws SQLException {
}