druid数据源
Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能
自定义配置druid数据源
1.引入依赖
首先,在pom.xml中,添加druid的依赖,jdbc的stater,以及mysql驱动:
<!-- jdbc stater -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
2.配置自定义dataSoruce的Bean组件
默认情况下,springboot会使用Hikari数据源,默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)。
使用@Configuration标识这个类是一个配置类
package com.robin.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class MyDataSourceConfig {
// 默认情况下,springboot会使用Hikari数据源
// 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
// 设定数据源的初始配置,数据库的账户密码,url,以及jdbc驱动
druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
"utf8&serverTimezone=Asia/Shanghai&useSSL=false");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
return druidDataSource;
}
}
3.测试sql,验证数据源是否配置成功
在当前springboot项目中的测试类中,进行测试,使用原生的jdbcTemplate去测试,并且使用slf4j日志来查看输出信息。
package com.robin.boot;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Slf4j
@SpringBootTest
class DemoReSqlApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
log.info("记录数为{}",aLong);
log.info("数据源{}",dataSource.getClass());
}
}
ok,数据源配置成功…
4.开启 StatFilter,wallFilter,lg4j以及内置监控信息页面
Druid内置提供一个StatFilter,wallfilter,用于统计监控信息及sql防火墙。也可以使用日志记录信息log4j。
查看druid官方文档,其提供的xml配置如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat,wall,log4j" />
</bean>
dataSource对应的bean组件,我们已经在上面创建过了,所以开启统计信息只需要在bean组件中,添加属性即可// 开启stat sql监控信息 druidDataSource.setFilters("stat,wall,log4j");
开启druid内置监控页面,Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
其官网提供的xml配置如下:
<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
自定义Servlet来使用druid的内置监控页面:
使用 ServletRegistrationBean 类来创建一个自定义的servlet,且其名字为statViewServlet
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet = new StatViewServlet();
// 配置自定义的servlet,以及要处理的请求响应
ServletRegistrationBean<StatViewServlet> registrationBean =
new ServletRegistrationBean<>(statViewServlet,"/druid/*");
// 设定druid内置监控页面的登录账号密码信息
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","robin");
// 设置禁止清空内置监控页面数据信息
registrationBean.addInitParameter("resetEnable","false");
return registrationBean;
}
运行访问localhost:8080/druid
,自动跳转到druid监控页面的登录页,输入刚刚自定义的账号密码,登入查看:
此时我们的druid内置监控页面已经开启啦~~
5.开启Web关联监控配置
其官网提供的xml配置如下:
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就是一个名为DruidWebStatFilter的拦截器,类型为com.alibaba.druid.support.http.WebStatFilter。
使用 FilterRegistrationBean 创建一个自定义的filter,且其名为webStatFilter。
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> registrationBean =
new FilterRegistrationBean<WebStatFilter>(webStatFilter);
// 设置拦截路径
registrationBean.setUrlPatterns(Arrays.asList("/*"));
// 设置放行路径
registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return registrationBean;
}
6.开启Spring关联监控配置
Druid提供了Spring和Jdbc的关联监控。有两种方式,按类型拦截配置和方法名正则匹配拦截配置。
<!-- 1.按类型拦截配置-->
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>
<bean id="druid-type-proxyCreator" class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
<!-- 所有ABCInterface的派生类被拦截监控 -->
<property name="targetBeanType" value="xxxx.ABCInterface" />
<property name="interceptorNames">
<list>
<value>druid-stat-interceptor</value>
</list>
</property>
</bean>
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>
<!--2.方法名正则匹配拦截配置 -->
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>
<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
scope="prototype">
<property name="patterns">
<list>
<value>com.mycompany.service.*</value>
<value>com.mycompany.dao.*</value>
</list>
</property>
</bean>
<aop:config>
<aop:advisor advice-ref="druid-stat-interceptor"
pointcut-ref="druid-stat-pointcut" />
</aop:config>
7.编写controller,测试sql是否会被监控页面看到
使用原生的jdbctemplate,将sql进行查询,然后通过@GetMapping(“/sql”),映射请求。
package com.robin.boot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SqlTestController {
@Autowired
JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping("/sql")
public String querySql(){
Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
return aLong.toString();
}
}
8.统一测试,查看监控页面
除了spring监控(没有配置),其余都正确监控了
9.完整的自定义配置druid数据源,和项目结构
完整的自定义配置druid数据源:
package com.robin.boot.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.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;
import java.sql.SQLException;
import java.util.Arrays;
@Configuration
public class MyDataSourceConfig {
// 默认情况下,springboot会使用Hikari数据源
// 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
// 设定数据源的初始配置,
druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
"utf8&serverTimezone=Asia/Shanghai&useSSL=false");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 开启stat sql监控信息
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
// 配置druid的监控页
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet = new StatViewServlet();
// 配置自定义的servlet,以及要处理的请求响应
ServletRegistrationBean<StatViewServlet> registrationBean =
new ServletRegistrationBean<>(statViewServlet,"/druid/*");
// 设定druid内置监控页面的登录账号密码信息
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","robin");
// 设置禁止清空内置监控页面数据信息
registrationBean.addInitParameter("resetEnable","false");
return registrationBean;
}
// 配置WebStatFilter
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> registrationBean =
new FilterRegistrationBean<WebStatFilter>(webStatFilter);
// 设置拦截路径
registrationBean.setUrlPatterns(Arrays.asList("/*"));
// 设置放行路径
registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return registrationBean;
}
}
项目结构:
导入stater配置druid数据源(推荐-简单方便使用)
使用第三方提供的stater配置数据源,相比自定义配置使用很简单
1.引入依赖
<!-- jdbc stater-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- druid stater-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
2.编写application.yaml
首先将上面自定义的注释掉,使用stater的方式配置druid数据源,只需要引入依赖,然后修改application.yaml的配置信息即可,很方便。
spring:
datasource:
url: jdbc:mysql://localhost:3306/phpdemo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
aop-patterns: com.robin.boot # 监控SpringBean
filters: stat,wall # 开启sql监控和防火墙功能
stat-view-servlet: #配置监控页功能
enabled: true
login-username: admin
login-password: robin
reset-enable: false # 禁用刷新重置按钮
web-stat-filter: # 监控web
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
启动服务,用上面的controller进行测试,可以正确访问。