springboot整合druid


一.SpringBoot整合Druid

Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0、DBCP、PROXOOL等DB池的优点,整合配置参考地址。Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据库连接池和SQL查询的工作情况(最牛X的地方就在与提供的日志监控功能)。在上一章中(SpringBoot整合JDBC,JPA)讲述到,Spring Boot底层都是采用Spring Data的方式进行统一处理,Spring Data中内置连接池数据源HikariDataSource。SpringBoot整合Druid实现数据源更换,则需要手动配置。

1.新建SpringBoot工程,引入依赖

 基础依赖:新建SpringBoot工程,建议引入以下基础依赖

  spring-boot-starter-parent(SpringBoot父工程)——必选
  spring-boot-starter(SpringBoot启动器)——必选
  spring-boot-devtools(SpringBoot热部署)——可选
  spring-boot-starter-web(SpringBoot整合WEB)——必选
  mysql-connector-java(MySQL驱动)——必选
  druid-spring-boot-starter(SpringBoot整合Druid)——必选
  spring-boot-starter-jdbc(SpringBoot整合JDBC)——必选
  spring-boot-starter-test(SpringBoot整合测试Junit)——默认必选
  spring-boot-maven-plugin(SpringBoot打包插件)——必选
  lombok(整合Lombok简化POJO开发)——可选
  spring-boot-configuration-processor(SpringBoot整合配置文件注入POJO)——可选


 1 <!-- MySQL驱动 -->
 2 <dependency>
 3     <groupId>mysql</groupId>
 4     <artifactId>mysql-connector-java</artifactId>
 5     <scope>runtime</scope>
 6 </dependency>
 7         
 8 <!-- SpringBoot整合Druid -->
 9 <dependency>
10      <groupId>com.alibaba</groupId>
11      <artifactId>druid-spring-boot-starter</artifactId>
12      <version>1.1.22</version>
13 </dependency>


常见问题:整合如果没有引入spring-boot-starter-jdbc,会报错:.....ClassNotFoundException: org....jdbc....embedded.EmbeddedDatabaseType。

问题原因:Spring Boot底层都是采用Spring Data的方式进行统一处理。EmbeddedDatabaseType类在spring-boot-starter-jdbc依赖中。

依赖说明:SpringBoot属于Spring“全家桶”组件,Druid属于阿里巴巴旗下开发产品,所以SpringBoot整合Druid并不是由Spring组件提供依赖,而是由阿里巴巴提供。

 

2.修改yml配置文件,整合配置Druid

# 数据库访问配置, 使用druid数据源(默认数据源是HikariDataSource)

spring:
  datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource


initial-size: 5
min-idle: 5
max-active: 20
# 连接等待超时时间
max-wait: 30000
# 配置检测可以关闭的空闲连接,间隔时间
time-between-eviction-runs-millis: 60000
# 配置连接在池中的最小生存时间
min-evictable-idle-time-millis: 300000
# 检测连接是否有,有效得select语句
validation-query: select '1' from dual
# 申请连接的时候检测,如果空闲时间大于time-between-eviction-runs-millis,执行validationQuery检测连接是否有效,建议配置为true,不影响性能,并且保证安全性。
test-while-idle: true
# 申请连接时执行validationQuery检测连接是否有效,建议设置为false,不然会会降低性能
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效,建议设置为false,不然会会降低性能
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true

# 配置监控统计拦截的filters, 去掉后监控界面sql无法统计, 'wall'用于防火墙防御sql注入,stat监控统计,logback日志
filters: stat,wall
# Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
#aop-patterns: com.springboot.servie.*
# lowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢
useGlobalDataSourceStat: true
max-pool-prepared-statement-per-connection-size: 20
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

 

上述配置不但配置了Druid作为连接池,而且还开启了Druid的监控功能。




druid强大的地方在于它可以自定义配置

config包——————新建一个类DruidConfig——————DataSource druidDataSource(){return new DruidDataSource();}——————@Bean 注入到spring容器中——————@
ConfigurationProperties(prefix = "spring.datasource")

//后台监控 : 相当于web.xml
ServletRegistrationBean
//springboot内置了servlet容器,所有没有web.xml 替代方法:将ServletRegistrationBean注册进去
public ServletRegistrationBean StatViewServlet(){
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<StatViewServlet>(new StatViewServlet(), "/druid/**");
//后台有人要登录,账号密码配置
HashMap<String, String> initParameters = new HashMap<>();
initParameters.put("loginUsername","admin");
initParameters.put("loginPassword","123456"); //登录的key是固定的 必须是loginUsername loginPassword
//允许谁能访问
initParameters.put("allow","");
//也可以禁止谁能访问
initParameters.put("dragon","ip地址");


bean.setInitParameters(initParameters);//设置初始化参数
return bean;
}

//过滤器
@Bean
public FilterRegistrationBean webStaFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();

bean.setFilter(new WebStatFilter());


HashMap<String, String> initParameters = new HashMap<>();
initParameters.put("exclusions","*.js,*.css");

bean.setInitParameters(initParameters);
return bean;
}
 

					


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM