SpringBoot 中好用的数据连接池,入职 3 个月的 Java 程序员面临转正
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.
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>
此时访问监控页面的时候就需要输入我们设置的用户名和密码了,如果还想针对用户有敏感信息配置和访问权限控制,我们还可以配置allow
和deny
参数,例如:
<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
继续添加WebStatFilter
和StatViewServlet
的配置项:
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
评论