导入com.alibaba:druid-spring-boot-starter:1.1.9 包
创建类 import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import javax.servlet.Servlet; import javax.sql.DataSource;
import com.alibaba.druid.filter.Filter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; 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 com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter;
/**
-
@DESC druid配置类,会被springboot扫描然后将相应的service加到容器中 */ @Configuration @Slf4j public class DruidConfiguration { @Value("${spring.datasource.mydruid.Filters:stat,wall,slf4j}") private String Filters; @Value("${spring.datasource.mydruid.InitialSize:5}") private Integer InitialSize; @Value("${spring.datasource.mydruid.MinIdle:5}") private Integer MinIdle; @Value("${spring.datasource.mydruid.MaxActive:20}") private Integer MaxActive; @Value("${spring.datasource.mydruid.PoolPreparedStatements:true}") private boolean PoolPreparedStatements; @Value("${spring.datasource.mydruid.MaxPoolPreparedStatementPerConnectionSize:20}") private Integer MaxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.mydruid.ValidationQuery:select 'x'}") private String ValidationQuery; @Value("${spring.datasource.mydruid.TestOnBorrow:false}") private boolean TestOnBorrow; @Value("${spring.datasource.mydruid.TestOnReturn:false}") private boolean TestOnReturn; @Value("${spring.datasource.mydruid.WhileIdle:true}") private boolean WhileIdle; @Value("${spring.datasource.mydruid.MaxWait:6000}") private Integer MaxWait; @Value("${spring.datasource.mydruid.TimeBetweenEvictionRunsMillis:60000}") private Integer TimeBetweenEvictionRunsMillis; @Value("${spring.datasource.mydruid.UseGlobalDataSourceStat:true}") private boolean UseGlobalDataSourceStat;
@Value("${spring.datasource.mydruid.loginUsername:admin}") private String loginUsername; @Value("${spring.datasource.mydruid.loginPassword:admin}") private String loginPassword; @Value("${spring.datasource.mydruid.resetEnable:true}") private String resetEnable; @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druid() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource();
// 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 druidDataSource.setFilters(Filters); //自定义 sql 统计 应为druid 没有时间段 可以自己写 // List<Filter> filterList=new ArrayList<>(); // filterList.add(new TestDruidFilter()); // druidDataSource.setProxyFilters(filterList); // 初始化大小,最小,最大 druidDataSource.setInitialSize(InitialSize); druidDataSource.setMinIdle(MinIdle);
// 最大等待(空闲)连接中的数量,设 0 为没有限制 druidDataSource.setMaxActive(MaxActive); // 打开PSCache,并且指定每个连接上PSCache的大小 druidDataSource.setPoolPreparedStatements(PoolPreparedStatements); druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(MaxPoolPreparedStatementPerConnectionSize); // 校验sql druidDataSource.setValidationQuery(ValidationQuery); // 指明是否在从池中取出连接前进行检验,如果检验失败 则从池中去除连接并尝试取出另一个. 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 druidDataSource.setTestOnBorrow(TestOnBorrow); // 指明是否在归还到池中前进行检验 druidDataSource.setTestOnReturn(TestOnReturn); druidDataSource.setTestWhileIdle(WhileIdle); // 配置获取连接等待超时的时间 最大等待毫秒数, 单位为 ms, 如果超过此时间将接到异常,设为-1表示无限制 druidDataSource.setMaxWait(MaxWait); // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 druidDataSource.setTimeBetweenEvictionRunsMillis(TimeBetweenEvictionRunsMillis); // 合并多个DruidDataSource的监控数据 druidDataSource.setUseGlobalDataSourceStat(UseGlobalDataSourceStat); return druidDataSource; }
/**
* 配置druid管理页面的访问控制
* 访问网址: http://127.0.0.1:8080/druid
*
* @return
*/
@Bean
public ServletRegistrationBean<Servlet> druidServlet() {
log.info("初始化配置--druid");
ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>();
servletRegistrationBean.setServlet(new StatViewServlet()); //配置一个拦截器
servletRegistrationBean.addUrlMappings("/druid/*"); //指定拦截器只拦截druid管理页面的请求
HashMap<String, String> initParam = new HashMap<String, String>();
initParam.put("loginUsername", loginUsername); //登录druid管理页面的用户名
initParam.put("loginPassword", loginPassword); //登录druid管理页面的密码
initParam.put("resetEnable", resetEnable); //是否允许重置druid的统计信息
initParam.put("allow", ""); //ip白名单,如果没有设置或为空,则表示允许所有访问
servletRegistrationBean.setInitParameters(initParam);
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean<WebStatFilter> filterRegistrationBean() {
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<WebStatFilter>();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
} 实现自定义接口 从源码看的 import com.alibaba.druid.filter.FilterEventAdapter; import com.alibaba.druid.proxy.jdbc.StatementProxy;
public class TestDruidFilter extends FilterEventAdapter { @Override protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) {
System.err.println("监控sql----------执行后-------");
System.err.println("sql-----"+sql);
System.err.println("statement-----");
super.statementExecuteAfter(statement, sql, result);
}
@Override
protected void statementExecuteBefore(StatementProxy statement, String sql) {
System.err.println("监控sql----------执行前-------");
System.err.println("sql-----"+sql);
System.err.println("statement-----");
super.statementExecuteBefore(statement, sql);
}
} 配置文件 spring: application: name: datapull datasource: driver-class-name: com.mysql.cj.jdbc.Driver #mysql8 url: jdbc:mysql://xxxx:8066/xxx?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: xxx password: xxx mydruid: Filters: stat,wall,slf4j InitialSize: 5 MinIdle: 5 MaxActive: 20 PoolPreparedStatements: true MaxPoolPreparedStatementPerConnectionSize: 20 ValidationQuery: select 'x' TestOnBorrow: false TestOnReturn: false WhileIdle: false MaxWait: 6000 TimeBetweenEvictionRunsMillis: 60000 UseGlobalDataSourceStat: true loginUsername: admin loginPassword: admin resetEnable: true druid: db-type: com.alibaba.druid.pool.DruidDataSource