1. Druid是什么?
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
https://github.com/alibaba/druid
一.添加Maven依赖
1 2 3 4 5 |
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.11</version> </dependency> |
二.配置数据源相关信息
application.properties和application.yml配置都是可以的,spring boot会默认读取两种文件,yml默认是没有的,可以直接新建。
当然写在application.properties中要有略微的区别,因为语法不一样。
下边的是yml语法写的application.yml配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
spring: profiles: dev datasource: url: jdbc:mysql://192.168.215.233:3306/test?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true username: root password: root driver-class-name: com.mysql.jdbc.Driver #已废弃 #type: com.alibaba.druid.pool.DruidDataSource # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true |
application.properties中示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 数据库访问配置 # 主数据源,默认的 # 已废弃 #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.MySQL.jdbc.Driver spring.datasource.url=jdbc:MySQL://localhost:3306/test spring.datasource.username=root spring.datasource.password=root # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置获取连接等待超时的时间 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=20 # 配置监控统计拦截的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 #需要注意的是:spring.datasource.type旧的spring boot版本是不能识别的。 |
三.注入Druid数据源
注入数据源有两种方式。
一种@Bean("duridDatasource")这种注入,可以写在app.java种,也可以新建单独的类去实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package org.skyfox.spring_boot_demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; import com.alibaba.druid.pool.DruidDataSource; import javax.sql.DataSource; @SpringBootApplication @MapperScan("org.skyfox.spring_boot_demo.mapper") ////这行是为了避免扫描不到Druid的Servlet @ServletComponentScan("org.skyfox.spring_boot_demo.config.druid") public class App { public static void main( String[] args ) { SpringApplication.run(App.class); } @Bean("duridDatasource") @ConfigurationProperties(prefix="spring.datasource") public DataSource druidDataSource() { return new DruidDataSource(); } } |
再一种是新建类去实现EnvironmentAware接口和@Configuration@EnableTransactionManagement的方式注入druid数据源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
package org.skyfox.spring_boot_demo.config.druid; import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.alibaba.druid.pool.DruidDataSource; @Configuration @EnableTransactionManagement public class DataBaseConfiguration implements EnvironmentAware { private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment env) { this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource."); } @Bean(destroyMethod = "close", initMethod = "init") public DataSource writeDataSource() throws SQLException { System.out.println("注入druid!!!"); DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(propertyResolver.getProperty("url")); dataSource.setUsername(propertyResolver.getProperty("username"));//用户名 dataSource.setPassword(propertyResolver.getProperty("password"));//密码 dataSource.setDriverClassName(propertyResolver.getProperty("driver-class-name")); dataSource.setInitialSize(Integer.parseInt(propertyResolver.getProperty("initialSize"))); dataSource.setMaxActive(Integer.parseInt(propertyResolver.getProperty("maxActive"))); dataSource.setMinIdle(Integer.parseInt(propertyResolver.getProperty("minIdle"))); dataSource.setMaxWait(Integer.parseInt(propertyResolver.getProperty("maxWait"))); dataSource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(propertyResolver.getProperty("timeBetweenEvictionRunsMillis"))); dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(propertyResolver.getProperty("minEvictableIdleTimeMillis"))); dataSource.setValidationQuery(propertyResolver.getProperty("validationQuery")); dataSource.setTestOnBorrow(Boolean.getBoolean(propertyResolver.getProperty("testOnBorrow"))); dataSource.setTestWhileIdle(Boolean.getBoolean(propertyResolver.getProperty("testWhileIdle"))); dataSource.setTestOnReturn(Boolean.getBoolean(propertyResolver.getProperty("testOnReturn"))); dataSource.setPoolPreparedStatements(Boolean.getBoolean(propertyResolver.getProperty("poolPreparedStatements"))); dataSource.setMaxPoolPreparedStatementPerConnectionSize(Integer.parseInt(propertyResolver.getProperty("maxPoolPreparedStatementPerConnectionSize"))); //配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 dataSource.setFilters(propertyResolver.getProperty("filters")); return dataSource; } } |
四.配置监控统计功能
配置servlet有多种方式。web.xml 、注解 、代码。本文主要讲注解与代码方式,web.xml的原始方式在官方文档中可以查阅。
新建一个package,com.xxxxx.config.druid包,以下类都建在了config.druid包内。
Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
这个StatViewServlet的用途包括:提供监控信息展示的html页面,提供监控信息的JSON API(注意:使用StatViewServlet,建议使用druid 0.2.6以上版本。)
Druid内置提供一个StatFilter,用于统计监控信息。
1.基于注解模式的原生servlet
新建配置过滤器DruidStatFilter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package org.skyfox.spring_boot_demo.config.druid; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import com.alibaba.druid.support.http.WebStatFilter; //配置监控器 //过滤不需要监控的后缀 @WebFilter(filterName="druidWebStatFilter", urlPatterns="/*", initParams={ @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略资源 }) public class DruidStatFilter extends WebStatFilter { } |
servlet监控视图配置,新建DruidStatViewServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package org.skyfox.spring_boot_demo.config.druid; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import com.alibaba.druid.support.http.StatViewServlet; //监控视图配置 @WebServlet(urlPatterns = "/druid/*", initParams={ @WebInitParam(name="allow",value=""),// IP白名单 (没有配置或者为空,则允许所有访问) // @WebInitParam(name="deny",value="127.0.0.1"),// IP黑名单 (存在共同时,deny优先于allow) @WebInitParam(name="loginUsername",value="admin"),// 用户名 @WebInitParam(name="loginPassword",value="admin"),// 密码 @WebInitParam(name="resetEnable",value="true")// 禁用HTML页面上的“Reset All”功能 }) public class DruidStatViewServlet extends StatViewServlet { private static final long serialVersionUID = 2359758657306626394L; } |
在APP.java中使用@Bean("duridDatasource")这种方法注入Druid数据源。
最后在App.java类上加上注解:
1 |
@ServletComponentScan("org.skyfox.spring_boot_demo.config.druid") |
让spring能够扫描到我们自己编写的servlet和filter。
不添加 @ServletComponentScan 注解,访问druid页面就会404了。
然后启动项目后访问 http://127.0.0.1:8080/druid/ 即可查看数据源及SQL统计等。
2.使用代码方式注册Servlet
如果配置了第一种方法,注释掉app.java中的@ServletComponentScan 以及druidDataSource()方法或者删除相关java文件。
新建DruidConfiguration.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package org.skyfox.spring_boot_demo.config.druid; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import javax.sql.DataSource; 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 org.springframework.context.annotation.PropertySource; @Configuration //这里读取的是yml配置文件 也可以读取properties @PropertySource(value = "classpath:application.yml") 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",""); //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. // servletRegistrationBean.addInitParameter("deny",""); //登录查看信息的账号密码. 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; } } |
然后启动项目后访问 http://127.0.0.1:8080/druid/ 即可查看数据源及SQL统计等。
转载请注明:天狐博客 » Spring Boot配置阿里Druid数据源与统计监控