写点什么

SpringBoot 中好用的数据连接池,入职 3 个月的 Java 程序员面临转正

用户头像
极客good
关注
发布于: 刚刚

spring.datasource.max-idle=10spring.datasource.max-active=15spring.datasource.max-lifetime=86430000spring.datasource.log-abandoned=truespring.datasource.remove-abandoned=truespring.datasource.remove-abandoned-timeout=60spring.datasource.initialize=falsespring.datasource.sqlScriptEncoding=UTF-8


配置完毕,此时我们启动工程,即可看到控制台已经将我们配置的 HikariCP 数据库连接池信息打印出来了

阿里巴巴 Druid

提到大名鼎鼎的 Druid 连接池,相信很多人都不陌生,因为该连接池是阿里开源的优秀的连接池,几乎已经成为现在使用最多的连接池之一。我们先打开 Druid 的官方 github:


https://github.com/alibaba/druid


可以看到此项目已经有 19.4k 的 star 数,并且是 2019 最受欢迎的开源之一,经历过真实线上双十一的考验,可以说是个很成熟的开源连接池,而 Druid 连接池专为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防 SQL 注入,内置 Logging 能诊断 Hack 应用行为等。

快速使用

Druid 0.1.18 之后版本都发布到 maven 中央仓库中,所以你只需要在项目的 pom.xml 中加上 dependency 就可以了,中央仓库坐标如下:


<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid-version}</version></dependency>


这里我们使用了 springBoot,由于默认支持的数据连接池只有四种:dbcp,dbcp2, tomcat, hikariCP,并不包含 druid,所以我们这里也可以选择直接使用阿里官方编写的 druid-spring-boot-starter,并且我们添加对应的 mybatis 和 pageHelper 的依赖:


在 application.properties 中 进行数据源配置:

数据库访问配置

主数据源,默认的

spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/testspring.


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


datasource.username=rootspring.datasource.password=123456

下面为连接池的补充设置,应用到上面所有数据源中

初始化大小,最小,最大

spring.datasource.initialSize=5spring.datasource.minIdle=5spring.datasource.maxActive=20

配置获取连接等待超时的时间

spring.datasource.maxWait=60000

配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

spring.datasource.timeBetweenEvictionRunsMillis=60000

配置一个连接在池中最小生存的时间,单位是毫秒

spring.datasource.minEvictableIdleTimeMillis=300000spring.datasource.validationQuery=SELECT 1 FROM DUALspring.datasource.testWhileIdle=truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=false

打开 PSCache,并且指定每个连接上 PSCache 的大小

spring.datasource.poolPreparedStatements=truespring.datasource.maxPoolPreparedStatementPerConnectionSize=20

配置监控统计拦截的 filters,去掉后监控界面 sql 无法统计,'wall'用于防火墙

spring.datasource.filters=stat,wall,log4j

通过 connectProperties 属性来打开 mergeSql 功能;慢 SQL 记录

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

合并多个 DruidDataSource 的监控数据

#spring.datasource.useGlobalDataSourceStat=true


配置完毕以后,由于这里我们使用了 mybatis,所以我们还要在 application.properties 中配置一下 mybatis 相关:


#mybatis#entity 扫描的包名 mybatis.type-aliases-package=com.xiaolyuh.domain.model#Mapper.xml 所在的位置 mybatis.mapper-locations=classpath*:/mybaits/*Mapper.xml#开启 MyBatis 的二级缓存 mybatis.configuration.cache-enabled=true


#pagehelperpagehelper.helperDialect=mysqlpagehelper.reasonable=truepagehelper.supportMethodsArguments=truepagehelper.params=count=countSql


准备就绪后,我们来编写一个测试类:


@RunWith(SpringRunner.class)@SpringBootTestpublic class DataSourceTests {


@AutowiredApplicationContext applicationContext;


@Testpublic void testDataSource() throws Exception {// 获取配置的数据源 DataSource dataSource = applicationContext.getBean(DataSource.class);System.out.println(dataSource.getClass().getName());}}


将测试方法运行起来,即可在控制台中看到对应的数据源的输出信息

Druid 开启监控统计功能

druid 最强大的功能就是自身提供了对 sql 的数据监控功能,并且内置了很多详细的拦截器,可以实现多个角度的拦截处理,那么如何开启监控?在 Druid 中内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息,这个 StatViewServlet 的用途包括:


  • 提供监控信息展示的 html 页面

  • 提供监控信息的 JSON API


如果是 ssm 工程,则可以在 web.xml 中配置 StatViewServlet,如下:


<servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class></servlet><servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern></servlet-mapping>


配置完毕以后,启动工程则可以按照配置的监控地址访问监控信息,默认为:http://ip:port/project-name/druid/index.html


同样的,在 StatViewServlet 中我们可以添加访问密码的设置,只需要配置 Servlet 的?loginUsername?和?loginPassword这两个初始参数 即可,例如:


<servlet>


<servlet-name>DruidStatView</servlet-name>


<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>


<init-param>


<param-name>resetEnable</param-name>


<param-value>true</param-value>


</init-param>


<init-param>


<param-name>loginUsername</param-name>


<param-value>druid</param-value>


</init-param>


<init-param>


<param-name>loginPassword</param-name>


<param-value>druid</param-value>


</init-param>


</servlet>


<servlet-mapping>


<servlet-name>DruidStatView</servlet-name>


<url-pattern>/druid/*</url-pattern>


</servlet-mapping>


此时访问监控页面的时候就需要输入我们设置的用户名和密码了,如果还想针对用户有敏感信息配置和访问权限控制,我们还可以配置allowdeny参数,例如:


<servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class><init-param><param-name>allow</param-name><param-value>128.242.127.1/24,128.242.128.1</param-value></init-param><init-param><param-name>deny</param-name><param-value>128.242.127.4</param-value></init-param></servlet>


这里的访问规则为:


1.deny 配置优先于 allow,即 deny 为优先拒绝,即使在 allow 中配置了白名单,但是只要存在于 deny 中,一样也会被拒绝访问


2.如果 allow 没有配置,或者配置为空,默认为全部都可以访问,不进行白名单限制

使用 SpringBoot 配置监控

由于我们这里使用的是 SpringBoot,所以我们仅需要在application.properties 添加配置统计拦截的 filters:

配置监控统计拦截的 filters,去掉后监控界面 sql 无法统计,'wall'用于防火墙

spring.datasource.druid.filters=stat,wall,log4j


这里的配置是通过别名方式配置扩展支持的插件,如下:


  • 监控统计用的 filter:stat

  • 日志用的 filter:log4j

  • 防御 sql 注入的 filter:wall


接着我们需要在application.properties 继续添加WebStatFilterStatViewServlet的配置项:

WebStatFilter 配置,说明请参考 Druid Wiki,配置_配置 WebStatFilter

#启动项目后访问 http://127.0.0.1:8080/druid#是否启用 StatFilter 默认值 truespring.datasource.druid.web-stat-filter.enabled=truespring.datasource.druid.web-stat-filter.url-pattern=/*spring.datasource.druid.web-stat-filter.exclusions=.js,.gif,.jpg,.bmp,.png,.css,.ico,/druid/#缺省 sessionStatMaxCount 是 1000 个 spring.datasource.druid.web-stat-filter.session-stat-max-count=1000#关闭 session 统计功能 spring.datasource.druid.web-stat-filter.session-stat-enable=false#配置 principalSessionName,使得 druid 能够知道当前的 session 的用户是谁 #如果你 session 中保存的是非 string 类型的对象,需要重载 toString 方法 spring.datasource.druid.web-stat-filter.principalSessionName=xxx.user#如果 user 信息保存在 cookie 中,你可以配置 principalCookieName,使得 druid 知道当前的 user 是谁 spring.datasource.druid.web-stat-filter.principalCookieName=xxx.user#druid 0.2.7 版本开始支持 profile,配置 profileEnable 能够监控单个 url 调用的 sql 列表。spring.datasource.druid.web-stat-filter.profile-enable=false

StatViewServlet 配置,说明请参考 Druid Wiki,配置_StatViewServlet 配置

#启动项目后访问 http://127.0.0.1:8080/druid#是否启用 StatViewServlet 默认值 truespring.datasource.druid.stat-view-servlet.enabled=truespring.datasource.druid.stat-view-servlet.urlPattern=/druid/*#禁用 HTML 页面上的“Reset All”功能 spring.datasource.druid.stat-view-servlet.resetEnable=false#用户名 spring.datasource.druid.stat-view-servlet.loginUsername=admin#密码 spring.datasource.druid.stat-view-servlet.loginPassword=admin#IP 白名单(没有配置或者为空,则允许所有访问)spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1#IP 黑名单 (存在共同时,deny 优先于 allow)spring.datasource.druid.stat-view-servlet.deny=192.168.1.73

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot中好用的数据连接池,入职3个月的Java程序员面临转正