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(建议配置下) |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
MaxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | |
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 |
maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 |
validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 | |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | true | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
timeBetweenEvictionRunsMillis | Destroy线程会检测连接的间隔时间; testWhileIdle的判断依据,详细看testWhileIdle属性的说明 | |
numTestsPerEvictionRun | 不再使用,一个DruidDataSource只支持一个EvictionRun | |
minEvictableldleTimeMillis | Destory 线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis ,则关闭当前连接。 | |
connectionInitSqls | 物理连接初始化的时候执行的sql | |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: (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的基本使用。