SpringBoot整合Druid使用

Druid是什么?

Druid是阿里巴巴开源的一个数据源,主要用于java数据库连接池,相比spring推荐的DBCP和hibernate推荐的C3P0、Proxool数据库连接池,Druid在市场上占有绝对的优势。我在上一篇文章《SpringBoot整合JDBC使用》中提到了数据源,但是我们是在做数据库连接测试的时候打印输出了一下数据源,发现其是Hikari的。其实,SpringBoot2.0以上的版本默认的都是Hikari数据源,那么Druid与Hikari相比都有哪些优势呢。首先,Druid可以很好地监控数据库连接池和SQL的执行情况,可以说就是为针对监控而生的数据库连接池。也就是说,我执行了什么sql语句,什么时候执行的,执行了多长时间,执行的效果,这些对于Druid来说,它都能够看的一清二楚。目前,Druid和Hikari是JavaWeb上最优秀的两个数据源。

要使用Druid的话,首先需要在Maven官网上获取它的依赖。https://mvnrepository.com/

找到之后直接复制依赖文件到我们项目的pom文件中即可。

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>

接下来,我们选择我们的数据源类型,在applicatipn.yaml文件中指定,然后再启动我们之前的测试类来测试数据源。

我们发现,此时的数据源已经由Hikari变为Druid了。

其实,Druid还有一些其他的配置。

配置缺省值说明
name 配置这个属性的意义在于如果 存在多个数据源,监控的时候可以通过名字来区分。
jdbcUrl 传递给JDBC驱动的用于建立连接的URL
username 传递给JDBC驱动的用于建立连接的用户名
password 传递给JDBC驱动的用于建立连接的密码
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
MaxActive8最大连接池数量
maxIdle8已经不再使用,配置了也没效果
minIdle 最小连接池数量
maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturntrue归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis 

Destroy线程会检测连接的间隔时间;

testWhileIdle的判断依据,详细看testWhileIdle属性的说明

numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableldleTimeMillis Destory 线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis ,则关闭当前连接。
connectionInitSqls 物理连接初始化的时候执行的sql
exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
filters 

属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 
(1)监控统计用的filter:stat

(2)日志用的filter:log4j

(3)防御sql注入的filter:wall

proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

添加了依赖之后我们就可以在配置文件里进行相关的Druid的属性配置了。

我们暂时就给Druid配置以上这些基本属性,需要注意的是,配置filters属性时,它里边有个log4j,log4j主要是用来实现日志记录功能的,它需要maven的依赖,所以我们还得从maven仓库中找到log4j的依赖,并添加到pom文件中。

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
</dependency>

此时,我们启动一下之前使用过的增删改查的那个程序(即《SpringBoot整合JDBC使用》文章中的程序),发现并没有什么不同,那是因为这并不能体现Druid的强大。我们还需要给它自定义一些配置,然后再进行测试。

我们新建一个config的文件夹,将自定义配置写在DruidConfig.java文件中。

//后台监控
public ServletRegistrationBean statViewServlet(){

        ServletRegistrationBean<StatViewServlet> bean;
        bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
}

如上所示这段代码是固定的,凡是需要使用后台监控功能的,就直接使用这段代码即可,其中的“/druid/*”是我们要访问的地址,也不用去刻意更改,一般情况下,都是这个地址。这个地址是后台监控页面,是已经写好的,我们只需访问即可。

之后,我们需要知道,既然有有后台,那就需要有人去登陆。接下来我们设置登陆的用户名和密码。这些代码也是固定存在的。

//后台需要登陆,账号密码配置
HashMap<String,String> initParameters = new HashMap<>();
//增加配置
initParameters.put("loginUsername","admin");
initParameters.put("loginPassword","123456");
//允许访问
initParameters.put("allow","localhost");

如上代码所示,我们指定登陆的用户名为admin,密码为123456,那么,如果有一个叫root的人来登录,即使密码正确,肯定也不能登陆成功。同时需要注意,参数“loginUsername”和“loginPassword”都是设置好的,不要随便更改参数名。参数“allow”代表的是允许哪个用户访问,如果我们参数值为空,那么就代表着所有人都能访问,如果我们让参数值为localhost,那么能够访问的只有本机。除此之外,我们还能设置禁止访问的人员。

DruidConfig.java文件

package com.example.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;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    //绑定配置文件
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean

    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
    @Bean
    //后台监控
    public ServletRegistrationBean statViewServlet(){

        ServletRegistrationBean<StatViewServlet> bean;
        bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");

        //后台需要登陆,账号密码配置
        HashMap<String,String> initParameters = new HashMap<>();
        //增加配置
        initParameters.put("loginUsername","admin");
        initParameters.put("loginPassword","123456");

        //允许访问人员
        initParameters.put("allow","localhost");    //如果为空,即所有人都可访问,localhost只能本机访问

        bean.setInitParameters(initParameters);       //设置初始化参数
        return bean;
    }
    //过滤
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        
        //设置过滤内容
        Map<String,String> initParameters = new HashMap<>();
        //设置这些内容不进行统计
        initParameters.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(initParameters);
        return bean;
    }
}

接下来,我们启动程序,就看到和之前变化很大了。

我们还是使用localhost来查看运行结果。如果我们需要登陆的话,就得使用我们设置的用户名和密码来登录,否则会登录失败。

登录之后的效果如上图所示,有当前使用的Druid十五版本号、驱动,一些路径等等,还有SQL监控、SQL防火墙等,这些都是页面自动生成的,也就是我们说过的那个"/druid/*"路径。此时,我们可以测试一下SQL监控,之前的代码中有着我们写的增删改查的代码,现在我们使用另一个localhost来运行一下我们的sql代码,看一下监控结果。

我们执行了查询所有数据的失去了语句,此时SQL监控显示如下:

执行了什么sql语句,用了多长时间等等,都能看得到。除此之外,SQL防火墙中还能看到一些统计数据,白名单之类的,当然,还有它们的广告。

以上就是SpringBoot整合Druid的基本使用。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于springboot整合druid配置,你可以按照以下步骤进行: 1. 在pom.xml文件中添加druid和jdbc依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 2. 在application.properties文件中添加druid的配置: ``` # 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Druid配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,log4j spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # Druid监控配置 spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.reset-enable=false spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=admin ``` 3. 在启动类上添加注解@EnableTransactionManagement和@Bean注解的方法创建DruidDataSource: ``` @SpringBootApplication @EnableTransactionManagement public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource druidDataSource() { return new DruidDataSource(); } } ``` 以上就是整合druid的配置步骤,你可以根据自己的需求进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值