Spring Boot连接池性能对比与druid使用

1. 各种数据库连接池对比

在这里插入图片描述

1.1 LRU

LRU(Least Recently Used)是一个性能关键指标,特别Oracle,每个Connection对应数据库端的一个进程,如果数据库连接池遵从LRU,有助于数据库服务器优化,这是重要的指标。在测试中,Druid、DBCP、Proxool是遵守LRU的。BoneCP、C3P0则不是。BoneCP在mock环境下性能可能好,但在真实环境中则就不好了。

1.2 PSCache

PSCache(PrepareStatementCache )是数据库连接池的关键指标。在Oracle中,类似SELECT NAME FROM USER WHERE ID = ?这样的SQL,启用PSCache和不启用PSCache的性能可能是相差一个数量级的。Proxool是不支持PSCache的数据库连接池,如果你使用Oracle、SQL Server、DB2、Sybase这样支持游标的数据库,那你就完全不用考虑Proxool。

1.3 PSCache-Oracle-Optimized

Oracle 10系列的Driver,如果开启PSCache,会占用大量的内存,必须做特别的处理,启用内部的EnterImplicitCache等方法优化才能够减少内存的占用。这个功能只有DruidDataSource有。如果你使用的是Oracle Jdbc,你应该毫不犹豫采用DruidDataSource。

1.4 ExceptionSorter

ExceptionSorter是一个很重要的容错特性,如果一个连接产生了一个不可恢复的错误,必须立刻从连接池中去掉,否则会连续产生大量错误。这个特性,目前只有JBossDataSource和Druid实现。Druid的实现参考自JBossDataSource,经过长期生产反馈补充。

2. 性能测试

  • 补充说明:
    如果不进行缓存,则MySQL服务端预编译也好,本地预编译也好,都会对同一种语句重复预编译。因此为了提升效率,往往我们需要启用缓存,通过设置连接中cachePrepStmts参数就可以控制是否启用缓存,useServerPrepStmts开启服务端预编译。此外通过prepStmtCacheSize参数可以控制缓存的条数,MySQL驱动默认是25,通常实践中都在250-500左右;通过prepStmtCacheSqlLimit可以控制长度多大的sql可以被缓存,MySQL驱动默认是256,通常实践中往往设置为2048这样。

jdbc:mysql://localhost/test?useServerPrepStmts=true&cachePrepStmts=true

通过id查询1000次所花的时间(三次平均):

连接池耗时
druid3,034
druid+pscache3,034
hikeri3,102
开启mysql服务器缓存3,861

在简单语句下,pscache对性能没有提升,开启服务器预编译和缓存反而使性能下降。

3. druid的使用

  • 提高性能,将已经创建好的连接保存在连接池中,当有请求来时,直接从连接池中使用已经创建好的连接进行数据库服务器的访问。省略了创建连接和销毁连接的过程,TCP连接建立时的三次握手和销毁时的四次握手。
  • 嚣张的Druid(GitHub的Wiki上自称是Java语言最好的数据库连接池)。Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证。

3.1 连接池配置

# druid配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# druid参数调优(可选)
# 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
spring.datasource.druid.initial-size=5
#最小连接池数量
spring.datasource.druid.min-idle=5
#最大连接池数量
spring.datasource.druid.max-active=20
# 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
spring.datasource.druid.validation-query=select 'x'
#单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
spring.datasource.druid.validation-query-timeout=6
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
spring.datasource.druid.test-while-idle=true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
spring.datasource.druid.test-on-borrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
spring.datasource.druid.test-on-return=false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
spring.datasource.druid.pool-prepared-statements=true
#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#有两个含义:
#1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
#2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
spring.datasource.druid.time-between-eviction-runs-millis=60000
#连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
spring.datasource.druid.keepAlive=false
#连接保持空闲而不被驱逐的最小时间
spring.datasource.druid.min-evictable-idle-time-millis= 100000
# 配置监控统计拦截的filters
spring.datasource.druid.filters=stat
# asyncInit是1.1.4中新增加的配置,如果有initialSize数量较多时,打开会加快应用启动时间
spring.datasource.druid.async-init=true

3.2 开启监控

# 进行Druid的监控配置
# Druid内置提供一个StatFilter,用于统计监控信息(https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter)
# 启用StatFilter
spring.datasource.druid.web-stat-filter.enabled=true
# StatFilter过滤匹配
spring.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=true 
# 配置profileEnable能够监控单个url调用的sql列表
spring.datasource.druid.web-stat-filter.profile-enable=true 


# StatViewServlet配置,内置监控页面配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 禁用HTML页面上的“Reset All”功能
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 监控页面用户名和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
# IP白名单 (没有配置或者为空,则允许所有访问)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# IP黑名单 (存在共同时,deny优先于allow)
spring.datasource.druid.stat-view-servlet.deny=192.168.10.1


## Spring监控配置
# Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
spring.datasource.druid.aop-patterns=com.gavinbj.confmng.service.*
# 配置wall filter,详细参考:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
spring.datasource.druid.filter.wall.enabled=true
# 数据库指定为MySQL
spring.datasource.druid.filter.wall.db-type=mysql
# 是否允许执行Alter Table语句
spring.datasource.druid.filter.wall.config.alter-table-allow=false
# truncate语句是危险,缺省打开,若需要自行关闭
spring.datasource.druid.filter.wall.config.truncate-allow=false
# 是否循序执行删除表语句
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# 是否允许非以上基本语句的其他语句,缺省关闭,通过这个选项就能够屏蔽DDL
spring.datasource.druid.filter.wall.config.none-base-statement-allow=false
# 检查UPDATE语句的WHERE子句是否是一个永真条件
spring.datasource.druid.filter.wall.config.update-where-none-check=true
# 是否允许调用Connection.getMetadata方法,这个方法调用会暴露数据库的表信息
spring.datasource.druid.filter.wall.config.metadata-allow=true
# 对被认为是攻击的SQL进行LOG.error输出
spring.datasource.druid.filter.wall.log-violation=true
# 对被认为是攻击的SQL抛出SQLExcepton
spring.datasource.druid.filter.wall.throw-exception=true

打开Druid的监控页面:http://localhost:9002/gavin/druid/login.html

注意:账号:admin , 密码:admin 账号密码可以在application.properties 中修改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值