当前栏目
SpringBoot整合阿里巴巴Druid数据源
Druid连接池是阿里巴巴内部唯一使用的连接池,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。,在内部数据库相关中间件TDDL/DRDS 都内置使用强依赖了Druid连接池,经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证。
Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
特点:
1)稳定性特性,阿里巴巴的业务验证
2)完备的监控信息,快速诊断系统的瓶颈
3)内置了WallFilter 提供防SQL注入功能
1. 引入POM依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
2. 切换默认数据源
Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以 通过 spring.datasource.type 指定数据源
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource
配置完成后,重新启动项目,通过测试类DataSource可以看到数据源已经切换成功
@Resource private DataSource dataSource; @Test void JDBCTest() throws SQLException { System.err.println(dataSource.getClass()); }
3. 修改数据源相关配置
spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 初始化时建立物理连接的个数 initialSize: 5 # 最小连接池数量 minIdle: 5 # 最大连接池数量 maxActive: 201 # 获取连接时最大等待时间,单位毫秒 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 连接保持空闲而不被驱逐的最小时间 minEvictableIdleTimeMillis: 300000 # 用来检测连接是否有效的sql,要求是一个查询语句 validationQuery: SELECT 1 FROM DUAL # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 testWhileIdle: true # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnBorrow: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 poolPreparedStatements: true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 maxPoolPreparedStatementPerConnectionSize: 20 # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
配置 | 缺省值 | 说明 |
---|---|---|
name | 配置这个属性的意义在于没如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是”DataSource-“+System.identityHashCode(this) | |
jdbcurl | 连接数据库的url,不同数据库不一样 | |
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中 | |
driverClassName | 这一项可配可不配,如果不配置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 | false | 归还连接时执行它validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunMills,执行validationQuery检测连接是否有效 |
timeBetweenEvictionRunMillis | 1分钟 | 有两个含义:Destory线程会检测连接的间隔时间 testWhileIdle的判断依据,详细看testWhileIdele属性的说明 |
numTestsPerEvictionRun | 不再使用,一个DruidDataSource只支持一个EvicationRun | |
minEvictableIdleTimeMillis | 30分钟 | |
connectionInitSqls | 物理连接初始化的时候执行sql | |
exceptionSorter | 根据DBType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter;log4j防御注入的filter:wall | |
proxyFilters | 类型是List<com.alibaba.druid,filter.Filter>,如果同时配置filter和proxyFilters,是组合关系,并非 |
4.编写Druid监控
Druid数据源具有监控的功能,并提供了一个 web 界面方便用户查看,编写Druid配置类来配置监控
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.Arrays; import java.util.HashMap; import java.util.Map; @Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDatasource() { return new DruidDataSource(); } //配置 Druid 监控管理后台的Servlet; //内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式 @Bean public ServletRegistrationBean statViewServlet() { ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); // 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到 Map<String, String> initParams = new HashMap<>(); initParams.put("loginUsername", "admin"); initParams.put("loginPassword", "123456"); initParams.put("allow", ""); //默认就是允许所有访问 initParams.put("deny", "192.168.10.132"); //deny:Druid 后台拒绝谁访问,表示禁止此ip访问 initParams.put("resetEnable","false"); //是否可以重置数据 bean.setInitParameters(initParams); return bean; } //2、配置一个web监控的filter @Bean public FilterRegistrationBean webStatFilter() { //创建过滤器 FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String, String> initParams = new HashMap<>(); // 或略过滤的形式 initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); bean.setInitParameters(initParams); //设置过滤路径 bean.setUrlPatterns(Arrays.asList("/*")); return bean; } }
5.监控连接
启动项目,访问 http://localhost:8080/druid/login.html?userCode=wrvvs1rm 即可进入Druid监控的登录页面
输入刚刚配置的用户名和密码
顺利登陆相关后台,在后台可以对当前数据源的各项数据进行查看
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- JavaScript 前端知识点总结
- C/C++ Qt 运用JSON解析库 [解析篇]
- C/C++ Qt 使用JSON解析库 [修改篇]
- JavaScript性能优化 DOM编程
- JavaScript定时器分析
- 《你不知道的JavaScript》整理(六)——强制类型转换
- 《你不知道的JavaScript》整理(五)——值与原生函数
- JavaScript实现按键精灵
- JavaScript中几个相似方法对比
- 日月如梭,玩转JavaScript日期
- JavaScript字符集编码与解码
- 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画
- 前端网络、JavaScript优化以及开发小技巧
- 《JavaScript设计模式 张》整理
- JavaScript特性(attribute)、属性(property)和样式(style)
- 《JavaScript设计模式与开发实践》整理
- 《你不知道的JavaScript》整理(四)——原型
- 《你不知道的JavaScript》整理(三)——对象
- 《你不知道的JavaScript》整理(二)——this
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包