赞
踩
说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主。
为什么要使用数据源:
数据源是提高数据库连接性能的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中。
当程序需要进行数据库访问时,无须重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。
当程序使用数据库连接访问数据库结束后,无须关闭数据库连接,而是将数据库连接归还给连接池即可。
通过这种方式,就可避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降
---引自
Druid官方github地址
Druid中文文档
Druid的介绍以及优点:
Druid是阿里巴巴开源平台上一个数据库连接池实现,它不但结合了C3P0、DBCP、PROXOOL等数据库连接池的优点,同时还加入了日志监控,可以分别监控DB池连接和SQL的执行情 况,是一款针对监控而生的数据库连接池
整合第三方技术的两种方式
博主版本:1.2.6
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>版本号</version>
- </dependency>
因为在引入数据源,SpringBoot默配置的数据源是HikariDataSource,所以我们如果要使用Druid的话,需要自己创建一个数据源,并放到容器中使用,myDataSourceConfig文件代码如下:
- 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 MyDtaSourceConfig {
- @Bean
- public DataSource dataSource() {
-
- return new DruidDataSource(); //创建Druid数据源
- }
- }
为什么我们创建的数据源可以使用呢?
在DataSourceAutoConfiguration中的以下部分可以发现:
- @Configuration(proxyBeanMethods = false)
- @Conditional(PooledDataSourceCondition.class)
- @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
- @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
- DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
- DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
- protected static class PooledDataSourceConfiguration {
-
- }
有引入DataSourceConfiguration.Hikari.class这个默认类,点击进入,
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(HikariDataSource.class)
- @ConditionalOnMissingBean(DataSource.class)
- @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
- matchIfMissing = true)
- static class Hikari {
-
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource.hikari")
- HikariDataSource dataSource(DataSourceProperties properties) {
- HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
- if (StringUtils.hasText(properties.getName())) {
- dataSource.setPoolName(properties.getName());
- }
- return dataSource;
- }
-
- }

由上述代码可以发现,默认的配置源是HikariDataSource,但是有一个要求:
@ConditionalOnMissingBean(DataSource.class)
就是如果在容器中没有数据源,下面代码生效,也就是使用HikariDataSource,但是若容器中已经有开发者创建的数据源,那么开发者创建的优先。
在使用数据源的时候,不可避免地需要配置基本的属性,如:url、用户名、密码、端口号等。所以我们可以将这些信息抽取出来,放到配置文件中,
这里我们采用yaml写法application.yaml:
- spring:
- datasource:
- url: jdbc:mysql://localhost:3306/vuesite
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
使用ConfigurationProperties注解来进行属性的绑定:
- package com.xbhog.Config;
-
- import com.alibaba.druid.pool.DruidDataSource;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- import javax.sql.DataSource;
-
- @Configuration
- //配置数据源
- public class MyDtaSourceConfig {
- @ConfigurationProperties("spring.datasource") //属性绑定 要加对位置
- @Bean
- public DataSource dataSource() {
- DruidDataSource druidDataSource = new DruidDataSource();
-
- return druidDataSource;
- }
- }

进行单元测试:
- package com.xbhog;
-
- 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;
-
- @SpringBootTest
- @Slf4j
- class FirstAdminApplicationTests {
- @Autowired
- DataSource dataSource;
-
- @Test
- void contextLoads() {
- log.info("数据类型:{}",dataSource.getClass());
- }
- }

结果==> 数据类型:class com.alibaba.druid.pool.DruidDataSource
具体的配置绑定:个人博客
贴心文档链接:网页地址
我们需要配置一个servlet配置,然后放到容器中,输入账号密码,进入链接地址即可访问;
在配置数据源代码下:
- /**
- * 配置监控页
- */
- @Bean
- public ServletRegistrationBean staViewServlet(){
- //实例化StatViewServlet
- StatViewServlet statViewServlet = new StatViewServlet();
- //将实例化的实例化StatViewServlet 传入ServletRegistrationBean,并设置访问路径
- ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
-
- return registrationBean;
- }
结果:
因为登录设置还是在servlet中设置的,所以相关信息暂略,贴一个文档截图:
代码添加:
- @Bean
- public ServletRegistrationBean staViewServlet(){
- StatViewServlet statViewServlet = new StatViewServlet();
-
- ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
- //配置登录信息
- registrationBean.addInitParameter("loginUsername","admin");
- registrationBean.addInitParameter("loginPassword","123456");
- return registrationBean;
- }
结果:
测试Sql监控功能。
网页地址:
创建一个DruidDataSource组件,并配置其中的属性filters的value为stat,这样才能打开监控功能。
所以我们在创建数据源的地方需要配置filters属性:
- public class MyDtaSourceConfig {
- @ConfigurationProperties("spring.datasource")
- @Bean
- public DataSource dataSource() throws SQLException {
- DruidDataSource druidDataSource = new DruidDataSource();
- //加入监控功能
- druidDataSource.setFilters("stat");
- return druidDataSource;
- }
- }
也可以进行属性的配置来实现上述的效果:(第二种方法)
- spring:
- datasource:
- url: jdbc:mysql://localhost:3306/vuesite
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
-
- filters: stat
- tomcat:
- max-active: 12
然后设置一个请求,来测试监控功能;
创建一个controller:
- @Controller
- public class tablecontro {
-
- @Autowired
- JdbcTemplate jdbcTemplate;
-
- @ResponseBody //不经过视图解析器
- @GetMapping("/sql")
- public String druidquery(){
- Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class);
- return aLong.toString();
- }
- }
先访问localhost:8080/sql,然后进入http://localhost:8080/druid/index.html页面中的SQL监控,即可查看执行次数次数。
在最大并发的后面的有各种分布,可以参考官方文档:Druid连接池介绍
基本上还是跟上面一样的;
WebStatFilter用于采集web-jdbc关联监控的数据。
网页地址
配置一个WebStatFilter,然后需要初始化exclusions,来排除一些不必要的url.得先进行sql的请求
- /**
- * WebStatFilter用于采集web-jdbc关联监控的数据。
- */
- @Bean
- public FilterRegistrationBean webRegistrationBean(){
- WebStatFilter webStatFilter = new WebStatFilter();
- FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);
- registrationBean.setUrlPatterns(Arrays.asList("/*"));
- //添加一些不必要的ulr,在初始化的时候就执行
- registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
- return registrationBean;
- }
结果:
Web应用:
URL监控
wallfilter
所以我们可以结合Filter一起使用,代码如下:得先进行sql的请求。
- public class MyDtaSourceConfig {
- @ConfigurationProperties("spring.datasource")
- @Bean
- public DataSource dataSource() throws SQLException {
- DruidDataSource druidDataSource = new DruidDataSource();
- //加入监控功能
- druidDataSource.setFilters("stat,wall");
- return druidDataSource;
- }
- }
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。