小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Druid内置提供一个StatFilter,用于统计监控信息。
StatFilter 配置
StatFilter的别名是stat,这个别名映射配置信息保存在druid-xxx.jar/META-INF/druid-filter.properties。
在spring中使用别名配置方式如下:
@Bean
public DruidDataSource getDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
Properties properties = new Properties();
try {
//加载属性 自动读取类路径下配置文件
properties.load(MyBatisConfig.class.getClassLoader().getResourceAsStream("db.properties"));
//配置默认监控filter WallFilter:防止sql注入的过滤器 Slf4jFileter:日志记录JDBC执行的SQL
druidDataSource.setFilters("stat,wall,slf4j");
//开启慢sql监控,大于1000毫秒的为慢sql,默认是3秒
druidDataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000");
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
//如果Properties文件的属性名命名符合configFromPropety的参数Properties的命名规则,则自动赋值
druidDataSource.configFromPropety(properties); //自动读取设置属性
return druidDataSource;
}
上面的配置中,StatFilter和WallFilter、SlfFilter组合使用。
- WallFilter:防止sql注入的过滤器
- Slf4jFileter:日志记录JDBC执行的SQL
使用Druid的内置监控页面
要访问druid的内置监控页面,需要配置一个servlet :
@WebServlet(urlPatterns = "/druid/*",initParams = {
@WebInitParam(name = "loginUsername",value = "admin"), //登录用户名
@WebInitParam(name = "loginPassword",value = "123456"), //登录密码
@WebInitParam(name = "allow",value = ""), //ip白名单,没有配置或空,则允许所有访问
@WebInitParam(name = "deny",value = ""), //ip黑名单
@WebInitParam(name = "resetEnable",value = "false") //禁用html页面的reset all功能
})
public class DruidStatueServlet extends StatViewServlet {
}
或者在spring配置类中:
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings(new String[]{"/druid/*"}); //IP白名单 (没有配置或者为空,则允许所有访问)
reg.addInitParameter("allow", ""); //IP黑名单
reg.addInitParameter("resetEnable", "false"); //是否能够重置数据
reg.addInitParameter("loginUsername", "admin");//设置账号密码
reg.addInitParameter("loginPassword", "123456");
return reg;
}
启动服务器,通过地址栏访问:ip:端口号/应用名/druid/login.html
设置web监控
WebStatFilter用于采集web-jdbc关联监控的数据
@WebFilter(filterName = "druidStatueFilter", urlPatterns = "/*",
initParams = {
@WebInitParam(name = "exclusions",value = "*.js,*.jpg,*.png,*.css,/druid/*"), //添加需要忽略的格式信息
@WebInitParam(name = "profileEnable",value = "true"), //配置profileEnable能够监控单个url调用的sql列表
@WebInitParam(name = "principalCookieName",value = "USER_COOKIE")
})
public class DruidStatueFilter extends WebStatFilter {
}
或者在spring配置类中:
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
//添加过滤规则
filterRegistrationBean.addUrlPatterns(new String[]{"/*"});
//添加需要忽略的格式信息
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
//配置profileEnable能够监控单个url调用的sql列表
filterRegistrationBean.addInitParameter("profileEnable", "true");
//如果你的user信息保存在cookie中,你可以配置
filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
//principalCookieName,使得druid知道当前的user是谁 USER_COOKIE为cookie名
//使得druid能够知道当前的session的用户是谁
filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");
return filterRegistrationBean;
}
设置spring监控
//设置druid 的 aop切面类
@Bean(name = "druidStatInterceptor")
public DruidStatInterceptor getDruidStatInterceptor() {
return new DruidStatInterceptor();
}
//配置spring监控
@Bean
public BeanNameAutoProxyCreator getAutoProxyCreator() {
BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
beanNameAutoProxyCreator.setProxyTargetClass(true);
beanNameAutoProxyCreator.setBeanNames(new String[]{"*Mapper", "*Service"});
beanNameAutoProxyCreator.setInterceptorNames("druidStatInterceptor");
return beanNameAutoProxyCreator;
}