springboot中使用Druid

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: **Druid是一个JDBC组件,它包括三部分: **DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。DruidDataSource 高效可管理的数据库连接池。

**Druid是一个JDBC组件,它包括三部分: **
DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。
DruidDataSource 高效可管理的数据库连接池。
SQLParser

**Druid可以做什么? **

  1. 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  2. 替换DBCPC3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  3. 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
  4. SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-LoggingLog4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
    扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。

springboot中几种Druid连接池

目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikariCP三种连接池。Druid连接池可以通过定制化DataSource来实现
PSCache:PreparedStatementCache

功能| dbcp| druid| c3p0 |tomcat-jdbc| HikariCP|
----|------|----
是否支持PSCache| 是| 是 |是 |否 |否
监控| jmx |jmx/log/http |jmx,log |jmx| jmx
扩展性 |弱 |好 |弱 |弱 |弱
sql拦截及解析| 无 |支持 |无 |无 |无
代码 |简单 |中等 |复杂 |简单 |简单
特点 |依赖于common-pool |阿里开源,功能全面 |历史久远,代码逻辑复杂,且不易维护 ||优化力度大,功能简单,起源于boneCP
连接池管理| LinkedBlockingDeque |数组|| FairBlockingQueue| threadlocal+CopyOnWriteArrayList
更多详细的介绍可以参考http://www.iteye.com/magazines/90
开发文档地址:http://tool.oschina.net/apidocs/apidoc?api=druid0.26

属性(Parameter) 默认值(Default) 描述(Description)
username 连接数据库的用户名
password 连接数据库的密码
jdbcUrl 同DBCP中的jdbcUrl属性
driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 初始化连接:连接池启动时创建的初始化连接数量
maxActive 8 最大连接池数量(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxTotal属性
maxIdle 8 已经不再使用,配置了也没效果 *参见DBCP中的maxIdle属性
minIdle 最小连接池数量
maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedState- ments false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。
maxOpenPrepared- Statements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。在mysql中通常为select 'x',在oracle中通常为select 1 from dual
timeBetweenEviction-RunsMillis 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据
minEvictableIdle- TimeMillis Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。
removeAbandoned 对于建立时间超过removeAbandonedTimeout的连接强制关闭
removeAbandoned-Timeout 指定连接建立多长时间就需要被强制关闭
logAbandoned false 指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中
filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 1)监控统计用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall

在springboot中使用Druid的话首先第一步肯定是先引入依赖
版本1.0.29((Mar 14, 2017))

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.29</version>
</dependency>

由于Druid暂时不在Spring Boot中的直接支持,故需要进行配置信息的定制

1.把配置信息写在yml配置文件中

spring:
    # DATASOURCE
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/所用到的数据库名?useUnicode=true&characterEncoding=utf-8
        username: mysql数据库用户名
        password: mysql数据库密码
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,wall,log4j
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        useGlobalDataSourceStat: true

2.配置数据源。

@ConfigurationProperties会把配置文件的参数自动赋值到dataSource里。
druidStatViewServlet()配置监控界面。
druidWebStatViewFilter()编写过滤器,配合druid监控的使用。

@Configuration
public class DruidConfiguration {
    private Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource druidDataSource(
    ) {
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }
    @Bean
    public ServletRegistrationBean druidStatViewServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名单 (没有配置或者为空,则允许所有访问)
        registrationBean.addInitParameter("deny", "");// IP黑名单 (存在共同时,deny优先于allow)
        registrationBean.addInitParameter("loginUsername", "登录druid的用户名");
        registrationBean.addInitParameter("loginPassword", "登录druid的密码");
        registrationBean.addInitParameter("resetEnable", "false");
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean druidWebStatViewFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new WebStatFilter());
        registrationBean.addInitParameter("urlPatterns", "/*");
        registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }

在注入的两个bean中,一个是StatViewServlet(),一个是WebStatFilter()

StatViewServlet是一个标准的javax.servlet.http.HttpServlet

1.配置url-pattern
根据配置中的url-pattern来访问内置监控页面,如果是上面的配置/druid/*,内置监控页面的首页是/druid/index.html
2配置allow和deny
判断规则:
deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。
如果allow没有配置或者为空,则允许所有访问
其中
128.242.127.1/24
24表示,前面24位是子网掩码,比对的时候,前面24位相同就匹配。
不支持IPV6
由于匹配规则不支持IPV6,配置了allow或者deny之后,会导致IPV6无法访问。
3.配置resetEnable
StatViewSerlvet输出的html页面中,有一个功能是Reset All,执行这个操作之后,会导致所有计数器清零,重新计数。你可以通过配置参数关闭它。

WebStatFilter用于采集web-jdbc关联监控的数据。

exlusions配置
经常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。

启动项目后访问http://localhost:8080/druid/index.html 登录后
即可查看数据源及SQL统计等。

Paste_Image.png

如果是被deny的IP 127.0.0.1登录druid是这样的,但是换成localhost的话是可以的

Paste_Image.png
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
6月前
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
3076 2
Spring Boot 3 集成 Druid 连接池详解
|
6月前
|
druid Java 数据库连接
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
125 0
|
6月前
|
druid Java 数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
306 0
|
11天前
|
druid Java Maven
|
6月前
|
druid Java 关系型数据库
SpringBoot整合junit、整合Mybatis及使用Druid数据源
SpringBoot整合junit、整合Mybatis及使用Druid数据源
82 0
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
262 6
|
3月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
304 0
|
5月前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
679 5
|
5月前
|
druid Java 数据库
spring boot 整合 druid(深入浅出)
spring boot 整合 druid(深入浅出)
188 0