SpringBoot:集成Druid
Druid简介
为了提高性能操作数据库,需要使用数据库连接池。
Druid是阿里巴巴开源平台上一个数据库连接池的实现,结合了C3P0,DBCP等DB池的优点,同时加入了日志监控。
Druid可以很好的监控DB连接池和SQL的执行情况,天生就是针对监控而生的DB连接池。
SpringBoot2.0以上默认使用Hiakri数据源,可以说Hikari与Druid都是当前JavaWeb上最优秀的数据源。
我们将来学习SpringBoot如何集成Druid数据源,如何实现数据库监控。
配置数据源
环境前提:添加了web和jdbc以及mysql的依赖
<dependencies>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lambok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
- 添加Druid依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
- 切换数据源,我的配置文件是yaml格式
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=GMT%2B8&userUnicode=true&characterEncoding=utf-8
username: root
password: password
#SpringBoot2.0以上默认HikariDataSource数据源
type: com.alibaba.druid.pool.DruidDataSource
- 测试数据源是否成功切换
@SpringBootTest
class SpringBootDataApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
//查看数据源
System.out.println(connection.getClass());
}
}
结果:
class com.alibaba.druid.pool.DruidPooledConnection
- 在全局配置文件中设置连接池的私有属性 属性配置说明详见:DruidDataSource配置说明
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=GMT%2B8&userUnicode=true&characterEncoding=utf-8
username: root
password: password
#SpringBoot2.0以上默认HikariDataSource数据源
type: com.alibaba.druid.pool.DruidDataSource
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
- 导入log4j的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 不再使用SpringBoot自动配置,自己添加DruidDataSource组件到容器中,为DuridDataSource绑定全局配置文件中的参数,再添加到容器中。
配置思路:
- 将自己配置的duirdDataSource加上@Bean注解添加到IOC容器中
- 将配置文件里的属性和DruidConfig绑定
- 为DruidConfig添加功能
/**
* @author Claw
*/
@Configuration
public class DruidConfig {
/**
* 1.将自己配置的duirdDataSource加上@Bean注解添加到IOC容器中
* 2.将配置文件里的属性和DruidConfig绑定
* 3.为DruidConfig添加功能
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druiddDataSource(){
return new DruidDataSource();
}
/**
* 后台监控功能,代码是固定的.
* 这相当于在web.xml注册servlet.
* SpringBoot内置了Servlet容器,所以没有web.xml,ServletRegistrationBean是替代注册Servlet的一种方式.
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
HashMap<String,String> initParemeters = new HashMap<>();
//增加配置 用户名和用户密码, key固定的为loginUsername和loginPassword
initParemeters.put("loginUsername","admin");
initParemeters.put("loginPassword","12345");
//设置初始化参数
bean.setInitParameters(initParemeters);
return bean;
}
}
- 进行测试
在浏览器输入localhost:8080/druid 会进入后台监控页面,输入自己定义好的loginUsername和loginPassword
进入后台页面就能在首页看到druid的版本,驱动,jdk版本,和类加载器里的东西。也能看见红框标注的地方有很多功能。
编写一个Controller,使用JdbcTemplate来进行一个简单的查询。
/**
* @author Claw
*/
@RestController
public class JdbcController {
@Autowired
JdbcTemplate jdbcTemplate;
@RequestMapping("/findAll")
public List<Map<String, Object>> findTest() {
String sql = "select * from user";
jdbcTemplate.queryForList(sql);
return jdbcTemplate.queryForList(sql);
}
}
在Druid的后台监控页面的SQL监控模块就能看见监控数据了。
配置Druid Web监控 filter
/**
* 注册Filter
* FilterRegistrationBean也是替代注册filter的一种方式
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String,String> initParameters = new HashMap<>();
initParameters.put("exclusions","*.js,*.css,/durid/*");
// /*表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}