架构小白到砖家-11-数据库性能-druid数据源监控

单应用框架终于解决了用户请求问题和数据存储问题,日常生产运营过程中随着业务发展,应用的性能将经受一个比较大的考验,而数据库SQL性能是在数据量增长过后,最容易产生查询性能问题。为了方便大家快速定位问题SQL,所以对应用执行的SQL进行实时监控就很有必要了。当然也可以让运维同学帮忙直接去数据库端排查日志,但是这样的方式笨拙而且效率很低,不太符合咱们程序员独立解决问题的风格。还好咱们选择了一个比较优秀的数据源druid,阿里的大神们已经给咱们准备好了方案,我们只需要将监控功能打开就可以了。那让我们看看如何打开druid的封印。

druid的数据源配置信息,咱们已经添加进去到springboot的配置文件了,不清楚的小伙伴咱们可以在文章最后再贴,这为了阅读排版紧凑就先不展示。为什么我们一直在使用druid数据源,但是却无法直接监控呢?因为数据源监控功能并不是springjpa必备功能,所以默认spring是不支持的,需要单独打开。

好了,那咱们就来看看怎么打开druid监控功能,需要三个步骤就可以了。
第一步,手动初始化数据源DruidDataSource,为了让创建数据源的时候,做一些监控初始化工作,应用关闭时,处理销毁工作。这里有两个spring的小知识点,一个spring增加bean的初始化方法调用@Bean(destroyMethod = “close”, initMethod = “init”),另外一个批量注入指定配置信息@ConfigurationProperties(prefix = “spring.datasource”)。
在这里插入图片描述

第二步,注册druid监控的界面服务StatViewServlet,就是一个原生的servlet,这样我们就能访问监控界面了。
在这里插入图片描述

第三步,注册应用请求拦截器filterRegistrationBean,用于监控应用请求。
在这里插入图片描述

经过这三步操作,就可以使用druid的监控功能了,来看看效果吧。
在这里插入图片描述

在这里插入图片描述

具体的监控信息,咱们就不展开讨论了,大家可以自己研究一下,都是中文界面,容易上手。当然druid数据源的功能还有很多,后面会单独开一个专题来详细探讨,比如加密数据库密码信息、监控信息存储和数据接口使用、等等更深层次的知识。

回顾总结,数据源druid非常优秀,可以解决数据库连接管理工作外,还提供了完善的监控信息、安全加密等机制,平时它都是应用架构底层,完全被透明忽略掉了。

补上完整的代码,方便大家使用。

数据库配置信息

#数据库相关配置
spring.jpa.show-sql=false
#spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.hibernate.ddl-auto=create

# 数据库访问配置
# 主数据源,默认的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=${app.datasource.url}
spring.datasource.username=${app.datasource.username}
spring.datasource.password=${app.datasource.password}

# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=60
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒 
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小 
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=40
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.useGlobalDataSourceStat=true

druid监控信息springboot的注解方式

@Configuration
public class DruidConfiguration {

	@Bean(destroyMethod = "close", initMethod = "init")
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource druidDataSource() {
		DruidDataSource druidDataSource = new DruidDataSource();
		return druidDataSource;
	}

	/**
	 * 注册一个StatViewServlet
	 * 
	 * @return
	 */
	@Bean
	public ServletRegistrationBean druidStatViewServlet() {
		// org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

		// 添加初始化参数:initParams
		// 白名单:
		servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
		// IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
		servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
		// 登录查看信息的账号密码.
		servletRegistrationBean.addInitParameter("loginUsername", "admin");
		servletRegistrationBean.addInitParameter("loginPassword", "123456");
		// 是否能够重置数据.
		servletRegistrationBean.addInitParameter("resetEnable", "false");
		return servletRegistrationBean;
	}

	/**
	 * 注册一个:filterRegistrationBean
	 * 
	 * @return
	 */
	@Bean
	public FilterRegistrationBean druidStatFilter() {

		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

		// 添加过滤规则.
		filterRegistrationBean.addUrlPatterns("/*");

		// 添加不需要忽略的格式信息.
		filterRegistrationBean.addInitParameter("exclusions",
				"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
		return filterRegistrationBean;
	}
}

猜你喜欢

转载自blog.csdn.net/jea_dong/article/details/86235702
今日推荐