SpringBoot整合Druid
Posted 梁云亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Druid相关的知识,希望对你有一定的参考价值。
Druid简介
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
优点:
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,开发者可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
- 扩展JDBC,如果要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件
SpringBoot集成Druid
第一步:创建项目,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
注:如果没有引入spring-boot-starter-jdbc,会报错:java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType
第二步:配置文件
server:
port: 80
servlet:
context-path: /imbp
spring:
#配置数据源
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
# 连接池的配置信息:初始化大小,最小,最大
initial-size: 8
min-idle: 1
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
#验证库是否正常sql
validation-query: select x from dual
#空闲时验证,防止连接断开
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,wall用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
use-global-data-source-stat: true
第三步:编写 druid 监控类
@Configuration
public class DruidConfiguration
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DataSource druid()
return new DruidDataSource();
/**
* druid 数据源状态监控
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet()
//创建servlet注册实体
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//设置ip白名单
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//设置控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername","druid");
servletRegistrationBean.addInitParameter("loginPassword","1234");
//是否可以重置数据
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
/**
* druid 过滤器
* @return
*/
@Bean
public FilterRegistrationBean statFilter()
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
测试
验证系统使用的是Druid
按如下所示供测试代码,将断点设置到编号①所在的行,然后Debug高度可以看到dataSource接口的实现类就是durid的实现类,可以继续找到配置文件中的一些初始化参数
@RunWith(SpringRunner.class)
@SpringBootTest
class IntegratemyMyBatisPlusApplicationTests
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException
Connection connection = dataSource.getConnection();
PreparedStatement prepareStatement = connection.prepareStatement("select * from tb_emp where deptno=20"); //----- ①
ResultSet resultSet = prepareStatement.executeQuery();
while (resultSet.next())
String cityName = resultSet.getString("ename");
System.out.println(cityName);
结果:
查看Druid监控
网址:http://localhost:80/imbp/druid/index.html ,其中:
- localhost:指项目IP地址
- 80:指项目端口号
- imbp:指项目部署时的名称
结果:
监控中心说明如下:
名称 | 作用 |
---|---|
数据源 | 可以看到项目中管理的所有数据源配置的详细情况,除了密码没有显示外其他都在 |
SQL监控 | 可以查看所有的执行sql语句 |
SQL防火墙 | druid提供了黑白名单的访问,可以清楚的看到sql防护情况 |
Web应用 | 可以看到目前运行的web程序的详细信息 |
URI监控 | 可以监控到所有的请求路径的请求次数、请求时间等其他参数 |
Session监控 | 可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数 |
JSONAPI | 通过api的形式访问Druid的监控接口,api接口返回Json形式数据 |
以上是关于SpringBoot整合Druid的主要内容,如果未能解决你的问题,请参考以下文章
springboot---整合druid连接池---连接oracle数据库---整合mybatis---整合thymeleaf---日志配置
SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源配置 MyBatis事务控制druid 监控)