SpringBoot集成Druid
Druid
- 是一个阿里开源的连接池组件
- 加⼊了日志监控,不需要额外的界面开发
- 它不仅仅是一个数据库连接池,它的功能还包括监控和详细统计数据库访问性能,对数据库密码进行加密
在springboot 2.0 以上默认都是使⽤用Hikari数据源, Hikari与Druid都是当前⽐比较优秀的数据源
com.alibaba.druid.pool.DruidDataSource 基本配置参数如下:
配置 | 缺省值 | 说明 |
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:“DataSource-” + System.identityHashCode(this) | |
jdbcUrl | 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter | |
driverClassName | 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下) | |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | |
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 |
maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 |
validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 | |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
validationQueryTimeout | 单位:秒,检测连接是否有效的超时时间。底层调⽤用jdbc Statement对象的void setQueryTimeout(int seconds)⽅方法 | |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
timeBetweenEvictionRunsMillis | 1分钟(1.0.14) | 有两个含义: 1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 |
numTestsPerEvictionRun | 不再使用,一个DruidDataSource只支持一个EvictionRun | |
minEvictableIdleTimeMillis | 30分钟(1.0.14) | 连接保持空闲⽽而不不被驱逐的最⻓长时间 |
connectionInitSqls | 物理连接初始化的时候执行的sql | |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall | |
proxyFilters | 类型是List<com.alibaba.druid.filter. | |
maxPoolPreparedStatementPerConnectionSize | 10 | 要启⽤用PSCache,必须配置⼤大于0,当⼤大于0时poolPreparedStatements自动触发修改为true。单个connnection独享⼀一个statement cache,也就是说maxOpenPreparedStatements是针对单个connection链接的 |
连接池运行原理
- 连接池初始化的时候按照initialSize创建多个连接
- 有DB操作访问的时候,就从里面取一个
- 如果当前正在使用的连接=maxActive,就会进入等待,没有到maxActive拿一个空闲连接,没有空闲就创建一个新连接,等待超过maxWati则会报错
- 使用完毕还回去等待其它人用,不会物理销毁
- 每一个connection在连接池里都有空闲时长的,允许最大空闲时长:minEvictableldleTimeMillis,多久检测一次timeBetweenEvictionRunsMillis
- maxActive如何配置:理论上应该设置成最大并发数
- 只要连接被前端业务拿到就算不空闲了,这个时候如果说长时间占有连接,连接数是不会崩溃,连接池主动关闭是使用中的连接,属于一个高级功能
removeAbandoned=“true”
removeAbandonedTimeout=“60”
logAbandoned=“true”
知道了连接池的运行原理之后,我们就正式来用SpringBoot来集成它吧
java类配置
导入依赖:
正确的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
错误的依赖,使用这个yml是没有提示的
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
编写配置文件:application.yaml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatis?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
编写配置类:
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DruidDataSource druidDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
//加入监控功能,开启防火墙
dataSource.setFilters("stat,wall");
return dataSource;
}
/**
* druid
* 注册一个StatViewServlet
*/
//因为Springboot内置了servlet容器,所以没有web.xml,替代方法就是将ServletRegistrationBean注册进去
//加入后台监控
@Bean //这里其实就相当于servlet的web.xml
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> srb = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
// 添加IP白名单
srb.addInitParameter("allow", "127.0.0.1");
// 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
srb.addInitParameter("deny", "192.168.25.123");
// 添加控制台管理用户
srb.addInitParameter("loginUsername", "admin");
srb.addInitParameter("loginPassword", "123456");
// 是否能够重置数据
srb.addInitParameter("resetEnable", "false");
return srb;
}
//再配置一个过滤器,Servlet按上面的方式注册Filter也只能这样
/**
* druid过滤器
* 注册一个:filterRegistrationBean
*/
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterFilter=new FilterRegistrationBean<>(webStatFilter);
//添加过滤规则.
filterFilter.addUrlPatterns("/*");//拦截所有资源
// filterFilter.setUrlPatterns(Arrays.asList("/*"));//拦截所有资源
//以下资源不拦截*.js,*.gif,*.jpg,*.css等
filterFilter.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.css,*.ico,/druid/*");
return filterFilter;
}
}
sql监控
配置_StatViewServlet配置
Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
这个StatViewServlet的用途包括:
- 提供监控信息展示的html页面
- 提供监控信息的JSON API
注意:使用StatViewServlet,建议使用druid 0.2.6以上版本。
配置监控页面访问密码
需要配置Servlet的 loginUsername
和 loginPassword
这两个初始参数。
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DruidDataSource druidDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
/**
* druid
* 注册一个StatViewServlet
*/
//因为Springboot内置了servlet容器,所以没有web.xml,替代方法就是将ServletRegistrationBean注册进去
//加入后台监控
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> srb = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
// 添加IP白名单
srb.addInitParameter("allow", "127.0.0.1");
// 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
srb.addInitParameter("deny", "192.168.25.123");
// 添加控制台管理用户
srb.addInitParameter("loginUsername", "admin");
srb.addInitParameter("loginPassword", "123456");
// 是否能够重置数据
srb.addInitParameter("resetEnable", "false");
return srb;
}
光这样还是不行,还需要打开Druid的监控统计功能
打开Druid的监控统计功能
配置_StatFilter
Druid内置提供一个StatFilter,用于统计监控信息。StatFilter的别名是stat
修改代码
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DruidDataSource druidDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
//加入监控功能
dataSource.setFilters("stat");
return dataSource;
}
(*) property for user to setup 错误
问题根源
导致这个现象的根源是,项目中之前一直没有没有连接过一次数据库,没有使用过一次Database,也导致 database 的 init 方法没有初始化,所以这里是没有相关的信息的。
解决方案:
在项目中成功发送一次请求,需要连接一次数据库,简单查询一些数据就可以了。
控制层写下sql代码
@Controller
public class UserController {
@Autowired
JdbcTemplate jdbc;
@ResponseBody
@RequestMapping("/sql")
public String queryFromDb(){
Long aLong = jdbc.queryForObject("select count(*) from sys_role",Long.class);
return aLong.toString();
}
然后访问sql路径
配置WebStatFilter
WebStatFilter用于采集web-jdbc关联监控的数据。
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterFilter=new FilterRegistrationBean<>(webStatFilter);
//添加过滤规则.
filterFilter.setUrlPatterns(Collections.singletonList("/*"));//拦截所有资源
//以下资源不拦截*.js,*.gif,*.jpg,*.css等
filterFilter.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.css,*.ico,/druid/*");
return filterFilter;
}
}
配置 wallfilter(防火墙)
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DruidDataSource druidDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
//加入监控功能,开启防火墙
dataSource.setFilters("stat,wall");
return dataSource;
}
综合演示视频
注解配置druid
先了解一下下面几个注解
@WebServlet
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
下面是@WebServlet的属性列表。
属性名类型描述nameString指定Servlet 的 name 属性,等价于 servlet-name。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于url-pattern标签。loadOnStartupint指定 Servlet 的加载顺序,等价于 load-on-startup标签。initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于init-param标签。asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于async-supported 标签。descriptionString该 Servlet 的描述信息,等价于 description标签。displayNameString该 Servlet 的显示名,通常配合工具使用,等价于 display-name标签。
如:
@WebServlet( urlPatterns = {"/simple"}, asyncSupported = true,
loadOnStartup = -1,
name = "SimpleServlet",
displayName = "ss",
initParams = {
@WebInitParam(name = "username", value = "tom")
}
)
public class SimpleServlet extends HttpServlet{ … }
等价于
<servlet> <display-name>ss</display-name> <servlet-name>SimpleServlet</servlet-name>
<servlet-class>footmark.servlet.SimpleServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
<async-supported>true</async-supported>
<init-param>
<param-name>username</param-name>
<param-value>tom</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
@WebInitParam
源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented
public @interface WebInitParam {
String name();
String value();
String description() default "";
}
该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 和 的 子标签。
@WebInitParam 具有下表给出的一些常用属性:
属性名类型是否可选描述nameString否指定参数的名字,等价于 param-name。valueString否指定参数的值,等价于 param-value。descriptionString是关于参数的描述,等价于 description。initParams = { @WebInitParam(name = "username", value = "tom") @WebInitParam(name = "password", value = "123456")
}
等价于
<init-param> <param-name>username</param-name> <param-value>tom</param-value>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>也就是说@WebInitParam(name = "", value = "")等价于 <param-name></param-name>
<param-value></param-value>
@WebFilter
源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented
public @interface WebFilter {
String description() default "";
String displayName() default "";
WebInitParam[] initParams() default {};
String filterName() default "";
String smallIcon() default "";
String largeIcon() default "";
String[] servletNames() default {};
String[] value() default {};
String[] urlPatterns() default {};
DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};
boolean asyncSupported() default false;
}
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 ):
属性名类型描述filterNameString指定过滤器的 name 属性,等价于 filter-namevalueString[]该属性等价于 urlPatterns 属性。但是两者不应该同时使用。urlPatternsString[]指定一组过滤器的 URL 匹配模式。等价于url-pattern 标签。servletNamesString[]指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 servlet-name 的取值。dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。initParamsWebInitParam[]指定一组过滤器初始化参数,等价于 init-param 标签。asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于async-supported 标签。descriptionString该过滤器的描述信息,等价于 description 标签。displayNameString该过滤器的显示名,通常配合工具使用,等价于display-name 标签。
如:
@WebFilter(servletNames = {"SimpleServlet"},filterName="druidWebStatFilter") public class LessThanSixFilter implements Filter{...}
等价于
<filter> <filter-name>druidWebStatFilter</filter-name> <filter-class>xxx</filter-class>
</filter>
<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<servlet-name>SimpleServlet</servlet-name>
</filter-mapping>
@WebListener
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
该注解使用非常简单,其属性如下:源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented
public @interface WebListener {
String value() default "";
}
@WebListener 的常用属性
属性名类型是否可选描述valueString是该监听器的描述信息。
如:
@WebListener("This is only a demo listener") public class SimpleListener implements ServletContextListener{...}
如此,则不需要在 web.xml 中配置 标签了。它等价的 web.xml 中的配置形式如下:
<listener> <listener-class>footmark.servlet.SimpleListener</listener-class> </listener>
@MultipartConfig
源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface MultipartConfig {
String location() default "";
long maxFileSize() default -1L;
long maxRequestSize() default -1L;
int fileSizeThreshold() default 0;
}
该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:
@MultipartConfig 的常用属性
属性名类型是否可选描述fileSizeThresholdint是当数据量大于该值时,内容将被写入文件locationString是存放生成的文件地址。maxFileSizelong是允许上传的文件最大值。默认值为 -1,表示没有限制。maxRequestSizelong是针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。
编写配置文件:application.yaml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
url: jdbc:mysql://localhost:3306/vueadmin?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
编写配置类:
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DruidDataSource druidDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
//加入监控功能,开启防火墙
dataSource.setFilters("stat,wall");
return dataSource;
}
@WebServlet(urlPatterns = "/druid/*",
initParams={
@WebInitParam(name="allow",value=""),// IP白名单 (没有配置或者为空,则允许所有访问)
@WebInitParam(name="deny",value=""),// IP黑名单 (存在共同时,deny优先于allow)
@WebInitParam(name="loginUsername",value="admin"),// 用户名
@WebInitParam(name="loginPassword",value="admin"),// 密码
@WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能
})
public static class DruidStatViewServlet extends StatViewServlet {
}
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",
initParams={
@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
})
public static class DruidStatFilter extends WebStatFilter {
}
}
在启动类添加注解 @ServletComponentScan
//配置druid必须加的注解,如果不加,访问页面打不开,filter和servlet、listener之类的需要单独进行注册才能使用,spring boot里面提供了该注解起到注册作用
@ServletComponentScan(basePackages="com.zsq")
@SpringBootApplication(scanBasePackages="com.zsq")
public class SpringbootZsqDemoApplication {
public static void main(String[] args)throws Exception{
SpringApplication.run(MainApplication.class,args);
}
}
演示:
yml配置druid
源码分析
我们在com.alibaba.druid.spring.boot.autoconfigure包下找到DruidDataSourceAutoConfigure或者直接ctrl+N搜
@Configuration@ConditionalOnClass({DruidDataSource.class})@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
public DruidDataSourceAutoConfigure() {
}
@Bean(
initMethod = "init"
)
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
DruidStatProperties.class的部分源码截图
扩展配置项 spring.datasource.druid
DataSourceProperties.class的部分源码截图
DruidSpringAopConfiguration.class
DruidSpringAopConfiguration.class,监控SpringBean的;配置项:spring.datasource.druid.aop-patterns
DruidStatViewServletConfiguration.class
DruidStatViewServletConfiguration.class, 监控页的配置:spring.datasource.druid.stat-view-servlet;默认开启
DruidWebStatFilterConfiguration.class
DruidWebStatFilterConfiguration.class, web监控配置;spring.datasource.druid.web-stat-filter;默认开启
DruidFilterConfiguration.class
所有Druid自己filter的配置
public class DruidFilterConfiguration { private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat"; private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";
。。。。
}
官网使用的方式
官网使用的是properties,简单变一下就行了
对应的yml形式
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
url: jdbc:mysql://localhost:3306/vueadmin?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
#2.连接池配置
#初始化连接池的连接数量 大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
#配置获取连接等待超时的时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# Spring监控配置
aop-patterns: com.zsq.*
# 配置监控统,防火墙,日志
filters: wall,start,slf4j
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filter:
stat:
merge-sql: true
slow-sql-millis: 5000
log-slow-sql: true
enabled: true
wall:
enabled: true
#3.基础监控配置
web-stat-filter:
enabled: true
url-pattern: /*
#设置不统计哪些URL
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: true
session-stat-max-count: 100
#设置监控页面
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: false
#设置监控页面的登录名和密码
login-username: admin
login-password: admin
allow: 127.0.0.1
#deny: 192.168.1.100
演示