前言
好久没有更新 Spring Boot 系列文章, 你说忙么? 也可能是, 前段时间的关注点也许在其他方面了, 最近项目中需要开发小程序, 正好采用 Spring Boot 实现一个后端服务, 后面会把相关的代码案例分享出来, 不至于大家做小程序后端服务的时候一头雾水
在 Spring Boot 下默认提供了若干种可用的连接池 (dbcp,dbcp2, tomcat, hikari), 当然并不支持 Druid,Druid 来自于阿里系的一个开源连接池, 它提供了非常优秀的监控功能, 下面跟大家分享一下如何与 Spring Boot 集成
版本环境
Spring Boot 1.5.2.RELEASEDruid 1.1.6JDK1.7
系统集成
添加 pom.xml 依赖:
- <!-- Jpa -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <!-- MySql -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
- <!-- druid -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.1.6</version>
- </dependency>
配置 application.properties:
- # 数据源
- spring.datasource.url=jdbc:mysql://192.168.1.66:3306/spring_boot?characterEncoding=utf-8&useSSL=false
- spring.datasource.username=root
- spring.datasource.password=root
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
- # 初始化大小, 最小, 最大
- spring.datasource.initialSize=1
- spring.datasource.minIdle=3
- spring.datasource.maxActive=20
- # 配置获取连接等待超时的时间
- spring.datasource.maxWait=60000
- # 配置间隔多久才进行一次检测, 检测需要关闭的空闲连接, 单位是毫秒
- spring.datasource.timeBetweenEvictionRunsMillis=60000
- # 配置一个连接在池中最小生存的时间, 单位是毫秒
- spring.datasource.minEvictableIdleTimeMillis=30000
- spring.datasource.validationQuery=select 'x'
- 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,slf4j
- # 通过 connectProperties 属性来打开 mergeSql 功能; 慢 SQL 记录
- spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
配置 yml 文件 (与上二选一)
- spring:
- datasource:
- url: jdbc:mysql://192.168.1.66:3306/spring-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
- username: root
- password: root
- driver-class-name: com.mysql.jdbc.Driver
- platform: mysql
- type: com.alibaba.druid.pool.DruidDataSource
- # 下面为连接池的补充设置, 应用到上面所有数据源中
- # 初始化大小, 最小, 最大
- initialSize: 1
- minIdle: 3
- maxActive: 20
- # 配置获取连接等待超时的时间
- maxWait: 60000
- # 配置间隔多久才进行一次检测, 检测需要关闭的空闲连接, 单位是毫秒
- timeBetweenEvictionRunsMillis: 60000
- # 配置一个连接在池中最小生存的时间, 单位是毫秒
- minEvictableIdleTimeMillis: 30000
- validationQuery: select 'x'
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- # 打开 PSCache, 并且指定每个连接上 PSCache 的大小
- poolPreparedStatements: true
- maxPoolPreparedStatementPerConnectionSize: 20
- # 配置监控统计拦截的 filters, 去掉后监控界面 sql 无法统计,'wall'用于防火墙
- filters: stat,wall,slf4j
- # 通过 connectProperties 属性来打开 mergeSql 功能; 慢 SQL 记录
- connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
配置 Druid 的监控统计功能
- import java.sql.SQLException;
- import javax.sql.DataSource;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- 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 com.alibaba.druid.pool.DruidDataSource;
- import com.alibaba.druid.support.http.StatViewServlet;
- import com.alibaba.druid.support.http.WebStatFilter;
- /**
- * 阿里数据库连接池 Druid 配置
- * 创建者 柒
- * 创建时间 2018 年 3 月 15 日
- */
- @Configuration
- public class DruidConfiguration {
- private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
- private static final String DB_PREFIX = "spring.datasource";
- @Bean
- public ServletRegistrationBean druidServlet() {
- logger.info("init Druid Servlet Configuration");
- ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
- // IP 白名单 (没有配置或者为空, 则允许所有访问)
- servletRegistrationBean.addInitParameter("allow", "");
- // IP 黑名单 (共同存在时, deny 优先于 allow)
- //servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
- // 控制台管理用户
- servletRegistrationBean.addInitParameter("loginUsername", "admin");
- servletRegistrationBean.addInitParameter("loginPassword", "admin");
- // 是否能够重置数据 禁用 html 页面上的 Reset All 功能
- servletRegistrationBean.addInitParameter("resetEnable", "false");
- return servletRegistrationBean;
- }
- @Bean
- public FilterRegistrationBean filterRegistrationBean() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
- filterRegistrationBean.addUrlPatterns("/*");
- filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.CSS,*.ico,/druid/*");
- return filterRegistrationBean;
- }
- @ConfigurationProperties(prefix = DB_PREFIX)
- class IDataSourceProperties {
- private String url;
- private String username;
- private String password;
- private String driverClassName;
- private int initialSize;
- private int minIdle;
- private int maxActive;
- private int maxWait;
- private int timeBetweenEvictionRunsMillis;
- private int minEvictableIdleTimeMillis;
- private String validationQuery;
- private boolean testWhileIdle;
- private boolean testOnBorrow;
- private boolean testOnReturn;
- private boolean poolPreparedStatements;
- private int maxPoolPreparedStatementPerConnectionSize;
- private String filters;
- private String connectionProperties;
- @Bean
- public DataSource dataSource() {
- DruidDataSource datasource = new DruidDataSource();
- datasource.setUrl(url);
- datasource.setUsername(username);
- datasource.setPassword(password);
- datasource.setDriverClassName(driverClassName);
- //configuration
- datasource.setInitialSize(initialSize);
- datasource.setMinIdle(minIdle);
- datasource.setMaxActive(maxActive);
- datasource.setMaxWait(maxWait);
- datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
- datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
- datasource.setValidationQuery(validationQuery);
- datasource.setTestWhileIdle(testWhileIdle);
- datasource.setTestOnBorrow(testOnBorrow);
- datasource.setTestOnReturn(testOnReturn);
- datasource.setPoolPreparedStatements(poolPreparedStatements);
- datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
- try {
- datasource.setFilters(filters);
- } catch (SQLException e) {
- System.err.println("druid configuration initialization filter:" + e);
- }
- datasource.setConnectionProperties(connectionProperties);
- return datasource;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getDriverClassName() {
- return driverClassName;
- }
- public void setDriverClassName(String driverClassName) {
- this.driverClassName = driverClassName;
- }
- public int getInitialSize() {
- return initialSize;
- }
- public void setInitialSize(int initialSize) {
- this.initialSize = initialSize;
- }
- public int getMinIdle() {
- return minIdle;
- }
- public void setMinIdle(int minIdle) {
- this.minIdle = minIdle;
- }
- public int getMaxActive() {
- return maxActive;
- }
- public void setMaxActive(int maxActive) {
- this.maxActive = maxActive;
- }
- public int getMaxWait() {
- return maxWait;
- }
- public void setMaxWait(int maxWait) {
- this.maxWait = maxWait;
- }
- public int getTimeBetweenEvictionRunsMillis() {
- return timeBetweenEvictionRunsMillis;
- }
- public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
- this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
- }
- public int getMinEvictableIdleTimeMillis() {
- return minEvictableIdleTimeMillis;
- }
- public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
- this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
- }
- public String getValidationQuery() {
- return validationQuery;
- }
- public void setValidationQuery(String validationQuery) {
- this.validationQuery = validationQuery;
- }
- public boolean isTestWhileIdle() {
- return testWhileIdle;
- }
- public void setTestWhileIdle(boolean testWhileIdle) {
- this.testWhileIdle = testWhileIdle;
- }
- public boolean isTestOnBorrow() {
- return testOnBorrow;
- }
- public void setTestOnBorrow(boolean testOnBorrow) {
- this.testOnBorrow = testOnBorrow;
- }
- public boolean isTestOnReturn() {
- return testOnReturn;
- }
- public void setTestOnReturn(boolean testOnReturn) {
- this.testOnReturn = testOnReturn;
- }
- public boolean isPoolPreparedStatements() {
- return poolPreparedStatements;
- }
- public void setPoolPreparedStatements(boolean poolPreparedStatements) {
- this.poolPreparedStatements = poolPreparedStatements;
- }
- public int getMaxPoolPreparedStatementPerConnectionSize() {
- return maxPoolPreparedStatementPerConnectionSize;
- }
- public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
- this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
- }
- public String getFilters() {
- return filters;
- }
- public void setFilters(String filters) {
- this.filters = filters;
- }
- public String getConnectionProperties() {
- return connectionProperties;
- }
- public void setConnectionProperties(String connectionProperties) {
- this.connectionProperties = connectionProperties;
- }
- }
- }
启动应用, 访问地址: http://localhost:8080/druid/, 输入配置的账号密码登录之后, 即可查看数据源及 SQL 统计等监控效果图如下:
当然, 阿里巴巴也提供了 Druid 的 SpringBoot 集成版 (druid-spring-boot-starter), 可参考以下链接
参考:
- https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
- https://github.com/alibaba/druid/wiki
来源: https://blog.52itstyle.com/archives/2544/