SpringBoot集成Druid实现监控功能的示例代码
作者:Spirit_NKlaus
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。
官方的参考
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
一、传统web项目(如ssh,ssm)
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.23</version> </dependency>
使用xml或配置类配置好DruidDataSource
<!--使用druid数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"> <!--注入连接属性--> <property name="driverClassName" value="xxx"/> <property name="url" value="xxx"/> <property name="username" value="xxx"/> <property name="password" value="xxx"/> <!--初始化连接池大小--> <property name="initialSize" value="5"></property> <!--设置最大连接数--> <property name="maxActive" value="20"></property> <!--设置等待时间--> <property name="maxWait" value="5000"/> <!--配置数据源监控的filter--> <property name="filters" value="stat"></property> </bean>
在web应用中的WEB-INF/web.xml中进行相关配置
<servlet> <servlet-name>StatViewServlet</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <!--登陆名--> <init-param> <param-name>loginUsername</param-name> <param-value>admin</param-value> </init-param> <!-- 登录密码--> <init-param> <param-name>loginPassword</param-name> <param-value>2024</param-value> </init-param> <!--白名单--> <init-param> <param-name>allow</param-name> <param-value></param-value> </init-param> <!--黑名单--> <init-param> <param-name>deny</param-name> <param-value></param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>StatViewServlet</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <filter> <filter-name>WebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <!--过滤的样式--> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.css,*.ico,*.jpg,*.png,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>WebStatFilter</filter-name> <servlet-name>StatViewServlet</servlet-name> </filter-mapping>
二、springboot中引入原生的druid,依赖和上面一样,编写配置类即可
import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.wall.WallConfig; import com.alibaba.druid.wall.WallFilter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Configuration public class DruidConfig { //登陆账号 private final String USERNAME = "root"; //登陆密码 private final String PASSWORD = "123"; @Value("${spring.datasource.url:#{null}}") private String dbUrl; @Value("${spring.datasource.username: #{null}}") private String username; @Value("${spring.datasource.password:#{null}}") private String password; @Value("${spring.datasource.driverClassName:#{null}}") private String driverClassName; /** * 以下属性可在配置文件自行定义 */ private Integer initialSize = 5; private Integer minIdle = 10; private Integer maxActive = 20; private Integer maxWait = 60000; @Bean @Primary public DruidDataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); if (initialSize != null) { datasource.setInitialSize(initialSize); } if (minIdle != null) { datasource.setMinIdle(minIdle); } if (maxActive != null) { datasource.setMaxActive(maxActive); } if (maxWait != null) { datasource.setMaxWait(maxWait); } List<Filter> filters = new ArrayList<>(); filters.add(statFilter()); filters.add(wallFilter()); datasource.setProxyFilters(filters); return datasource; } @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new StatViewServlet()); servletRegistrationBean.addUrlMappings("/druid/*"); Map<String, String> initParameters = new HashMap<>(); //禁用HTML页面上的“Rest All”功能 initParameters.put("resetEnable", "false"); //ip白名单(没配置则允许所有访问) //initParameters.put("allow", ""); //ip黑名单,如果某个ip同时存在,deny优先于allow //initParameters.put("deny", ""); initParameters.put("loginUsername", USERNAME); initParameters.put("loginPassword", PASSWORD); servletRegistrationBean.setInitParameters(initParameters); return servletRegistrationBean; } @Bean public StatFilter statFilter() { StatFilter statFilter = new StatFilter(); //慢sql记录 statFilter.setLogSlowSql(true); statFilter.setMergeSql(true); //超过多少时间为慢sql statFilter.setSlowSqlMillis(3000); return statFilter; } @Bean public WallFilter wallFilter() { WallFilter wallFilter = new WallFilter(); //允许执行多条SQL WallConfig config = new WallConfig(); config.setMultiStatementAllow(true); wallFilter.setConfig(config); return wallFilter; } }
三、springboot druid starter方式
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version> </dependency>
按需配置application.yml的内容
spring: datasource: url: ****** username: ****** password: ****** driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 指定数据源类型 ######### 连接池 配置 ########## druid: # 配置初始化大小、最小、最大 initial-size: 5 minIdle: 10 max-active: 20 # 配置获取连接等待超时的时间(单位:毫秒) max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 # time-between-eviction-runs-millis: 2000 # 配置一个连接在池中最小生存的时间,单位是毫秒 # min-evictable-idle-time-millis: 600000 # max-evictable-idle-time-millis: 900000 # 用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,这是mysql # validationQuery: select 1 # 应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用 # testWhileIdle: true # 如果为true,默认是false,应用向连接池申请连接时,连接池会判断这条连接是否是可用的 # testOnBorrow: false # 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用 # testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle # poolPreparedStatements: true # 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true, # 在Druid中,不会存在Oracle下PSCache占用内存过多的问题, # 可以把这个数值配置大一些,比如说100 # maxOpenPreparedStatements: 20 # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 # keepAlive: true # Spring 监控,利用aop 对指定接口的执行时间,jdbc数进行记录 aop-patterns: "com.springboot.template.dao.*" ########### 启用内置过滤器(第一个 stat必须,否则监控不到SQL)########## filters: stat,wall,log4j2 # 自己配置监控统计拦截的filter filter: # 开启druiddatasource的状态监控 stat: enabled: true db-type: mysql # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中 log-slow-sql: true slow-sql-millis: 2000 # 日志监控,使用slf4j 进行日志输出 # slf4j: # enabled: true # statement-log-error-enabled: true # statement-create-after-log-enabled: false # statement-close-after-log-enabled: false # result-set-open-after-log-enabled: false # result-set-close-after-log-enabled: false ########## 配置WebStatFilter,用于采集web关联监控的数据 ########## web-stat-filter: # 启动 StatFilter enabled: true # 过滤所有url url-pattern: /* # 排除一些不必要的url exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 开启session统计功能 session-stat-enable: true # session的最大个数,默认100 session-stat-max-count: 1000 ########## 配置StatViewServlet(监控页面),用于展示Druid的统计信息 ########## stat-view-servlet: # 启用StatViewServlet enabled: true # 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html url-pattern: /druid/* # 不允许清空统计数据,重新计算 reset-enable: false # 配置监控页面访问密码 login-username: root login-password: 123 # 允许访问的地址,如果allow没有配置或者为空,则允许所有访问 # allow: # 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝 # deny:
访问监控页面
页面简单介绍
1、数据源页面:是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息)。
2、SQL监控页面:统计了所有SQL语句的执行情况。
3、URL监控页面:统计了所有Controller接口的访问以及执行情况。
4、Spring 监控页面,利用aop 对指定接口的执行时间,jdbc数进行记录。
5、SQL防火墙页面:druid提供了黑白名单的访问,可以清楚的看到sql防护情况。
6、Session监控页面:可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。
7、JSONAPI 页面:通过api的形式访问Druid的监控接口,api接口返回Json形式数据。
以上就是SpringBoot集成Druid实现监控功能的示例代码的详细内容,更多关于SpringBoot Druid监控的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- SpringBoot集成阿里巴巴Druid监控的示例代码
- 使用SpringBoot简单了解Druid的监控系统的配置方法
- SpringBoot配置Druid数据监控代码实例
- SpringBoot集成Druid监控页面最小化配置操作
- SpringBoot对Druid配置SQL监控功能失效问题及解决方法
- springboot项目中实现访问druid内置监控页面
- SpringBoot集成Druid连接池进行SQL监控的问题解析
- SpringBoot整合Druid实现数据库连接池和监控
- SpringBoot3整合Druid监控功能的项目实践
- springboot关闭druid监控 druid2改配置文件无效的解决
- Springboot整合Druid实现对访问的监控方式
- SpringBoot+Druid开启监控页面的实现示例