SpringBoot 整合 阿里巴巴的Druid

Druid 简介

Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。

Github 地址:https://github.com/alibaba/druid/ com.alibaba.druid.pool.DruidDataSource 基本配置参数 如下:

配置缺省值说明
name
配置这个属性的意义在于没如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是 "DataSource-"+System.identityHashCode(this)
jdbcUrl
连接数据库的 url,不同数据库不一样
username
连接数据库的用户名
password
连接数据库的密码。如果你不希望密码直接写在配置文件中
driverClassName
这一项可配可不配,如果不配置 druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassName(建议配置下)
initialSize
初始化时建立物理连接的个数,初始化发生在显示调用 init 方法,或者第一次 getConnection 时
maxActive
最大连接池数量
maxIdle
已经不再使用,配置了也没效果
minIdle
最小连接池数量
maxWait
获取连接时最大等待时间,单位毫秒,配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁
poolPreparedStatements
是否缓存 preparedStatement,也就是 PsCache。PSCache 对支持游标的数据库性能提升巨大,比如说 oracle。在 mysql 下建议关闭
maxOpenPreparedStatements
要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 自动触发修改为 true。在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置打一下,比如说 100
validationQuery
用来检测连接是否有效的 sql,要求是一个查询语句。如果 validationQuery 为 null,testOnBorrow、testOnReturn 、testWhileIdle 都不会起作用
testOnBorrow
申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能
testOnReturn
归还连接时执行它 validationQuery 检测连接是否有效,做了这个配置会降低性能
testWhileIdle
建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunMills,执行 validationQuery 检测连接是否有效
timeBetweenEvictionRunMillis
有两个含义: Destory 线程会检测连接的间隔时间 testWhileIdle 的判断依据,详细看 testWhileIdele 属性的说明
numTestsPerEvictionRun
不再使用,一个 DruidDataSource 只支持一个 EvicationRun
minEvictableIdleTimeMillis

connectionInitSqls
物理连接初始化的时候执行 sql
exceptionSorter
当数据库抛出一些不可恢复的异常时,抛弃连接
filters
属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的 filter:stat 日志用的 filter;log4j 防御注入的 filter:wall
proxyFilters
类型是 List,如果同时配置 filter 和 proxyFilters,是组合关系,并非

配置数据源

1、添加上 Druid 数据源依赖。

  com.alibabadruid1.1.21

2、切换数据源;之前已经说过 Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以 通过 spring.datasource.type 指定数据源。

spring:datasource:username: rootpassword: 123456url: jdbc:mysql://192.168.10.132:3306/jdbcdriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource

3、数据源切换之后,在测试类中注入 DataSource,然后获取到它,输出一看便知是否成功切换;

4、切换成功!既然切换成功,就可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等设置项;可以查看源码

spring:datasource:username: rootpassword: 123456url: jdbc:mysql://192.168.10.132:3306/jdbcdriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
#自动往数据库建表
#    schema:
#      - classpath:department.sqlinitialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

5、导入 Log4j 的依赖


log4jlog4j1.2.17

6、现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性;


@Configuration
public class DruidConfig {@ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DataSource druid(){return  new DruidDataSource();}}

7、测试类

@SpringBootTest
class SpringbootDataJdbcApplicationTests {//DI注入数据源@AutowiredDataSource dataSource;@Testpublic void contextLoads() throws SQLException {//看一下默认数据源System.out.println(dataSource.getClass());//获得连接Connection connection =   dataSource.getConnection();System.out.println(connection);DruidDataSource druidDataSource = (DruidDataSource) dataSource;System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());//关闭连接connection.close();}
}

输出结果 :可见配置参数已经生效!

配置 Druid 数据源监控

Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理;

@Configuration
public class DruidConfig {@ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DataSource druid(){return  new DruidDataSource();}//配置 Druid 监控管理后台的Servlet;
//内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式@Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到Map initParams = new HashMap<>();initParams.put("loginUsername","admin");initParams.put("loginPassword","123456");initParams.put("allow",""); //默认就是允许所有访问//deny:Druid 后台拒绝谁访问,表示禁止此ip访问// initParams.put("deny","192.168.10.132");bean.setInitParameters(initParams);return bean;}//2、配置一个web监控的filter@Beanpublic FilterRegistrationBean webStatFilter(){FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());Map initParams = new HashMap<>();initParams.put("exclusions","*.js,*.css,/druid/*");bean.setInitParameters(initParams);bean.setUrlPatterns(Arrays.asList("/*"));return  bean;}
}

运行 访问 :http://localhost:8080/druid/login.html

输入设置的账号密码进入页面:还可以执行一个命令,查看 SQL 监控:

执行查询部门:看监控数据:配置完毕后


作者:姜丝加姜丝

来源链接:

https://blog.csdn.net/weixin_44001568/article/details/106913781


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部