springboot项目配置Druid
一、druid介绍
1-1、Druid是什么?
Druid是阿里巴巴公司开源的一个Java语言的数据库连接池。
Druid能够提供强大的监控和扩展功能。
1-2、项目开源地址
https://github.com/alibaba/druid
1-3、官方文档
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
1-4、Druid可以做什么?
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
2、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。
3、DruidDataSource都支持PasswordCallback。
4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选 择相应的LogFilter,监控你应用的数据库访问情况。
5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。
二、Spring Boot与Druid的集成
2-1、pom依赖
<!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.13</version> </dependency> <!-- 阿里系的Druid依赖包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency>
<!-- Druid中用了log4j打印日志,不配置启动会报错 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
2-2、application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #连接池的配置信息 ## 初始化大小,最小,最大 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的大小(防火墙这一块一定不能开,sqlite不支持,会导致奇怪的异常) spring.datasource.poolPreparedStatements=false 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
DruidDataSource配置属性列表,可参考官网说明:
https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
2-3、DruidSource配置信息的定制
package com.example.demo.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; 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 javax.sql.DataSource; /** * Druid 配置信息 */ @Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druid(){ return new DruidDataSource(); } //配置Druid的监控 //1、配置一个管理后台的Servlet @Bean public ServletRegistrationBean registrationBean() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet()); //添加初始化参数:initParams servletRegistrationBean.addUrlMappings("/druid/*"); //白名单: 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", "admin"); //是否能够重置数据. servletRegistrationBean.addInitParameter("resetEnable", "false"); return servletRegistrationBean; } //2、配置一个web监控的filter @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); //添加过滤规则. filterRegistrationBean.addUrlPatterns("/*"); //添加不需要忽略的格式信息. filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
2-4、浏览器运行 http://localhost:8080/druid/index.html
账号/密码填写admin/admin(Druid配置信息中配置的),进入页面
三、druid日志logback.xml配置(只记录sql和时间)-如不需要,请忽略此章节
3-1、修改application.properties
spring.datasource.filters=stat,wall,slf4j
1
**注意:**将log4j修改为slf4j,修改后pom.xml就不需要依赖log4j的jar包
3-2、新增logback-spring.xml
resources目录下新增logback-spring.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!--常用符号 %p日志级别 %d{日期时间格式}日期时间 %c类名 %M方法名 %m日志消息 %n换行符 --> <configuration> <!--控制台日志打印--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%p %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%c.%M] - %m%n</pattern> </encoder> </appender> <appender name="druidFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>\data\druid.log-%d{yyyy-MM-dd} </FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </encoder> </appender> <!--druid日志打印--> <logger name="druid" level="DEBUG"> <appender-ref ref="console" /> <appender-ref ref="druidFile" /> </logger> <root level="INFO"> <appender-ref ref="console" /> </root> </configuration>
如果已有logback文件,则添加druid相关配置!
3-3、新增Slf4jLogFilter
DruidConfig中新增Slf4jLogFilter的bean配置,代码如下:
@Bean public Slf4jLogFilter logFilter(){ Slf4jLogFilter filter = new Slf4jLogFilter(); filter.setResultSetLogEnabled(false); filter.setConnectionLogEnabled(false); filter.setStatementParameterClearLogEnable(false); filter.setStatementCreateAfterLogEnabled(false); filter.setStatementCloseAfterLogEnabled(false); filter.setStatementParameterSetLogEnabled(false); filter.setStatementPrepareAfterLogEnabled(false); return filter; }
3-4、DataSource增加日志过滤器
DruidConfig中druid配置中配置日志过滤器,代码如下:
@ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druid(){ DruidDataSource druidDataSource = new DruidDataSource(); List list= new ArrayList(){{add(logFilter());}}; druidDataSource.setProxyFilters(list); return druidDataSource; }