摘要:
背景 核心服务、并发较高,查询接接口最高几万qps 对停顿比较敏感 jvm par new + cms、 堆分配较大,老年代6g、old gc水位 3G左右 ygc几分钟一次、full gc 十天一次 分库分表,对应多个数据库连接池对象 问题发现 stw告警,full gc stw超过500ms 查 阅读全文
摘要:
校验时机 从 hikariPool#getConnection() 拿到的连接,如果空闲超过 500ms则要检查它的有效性 PoolBase#isConnectionActive() public Connection getConnection(final long hardTimeout) th 阅读全文
摘要:
它是为了实现比 LinkedBlockingQueue 和 LinkedTransferQueue 更高的性能而特别定制的,根据连接池的特殊场景做了一些性能优化 容器类定义 public class ConcurrentBag<T extends IConcurrentBagEntry> imple 阅读全文
摘要:
houseKeeper 定时检查空闲连接,对于超过 minimumIdle 的那部分db连接,如果空闲时长大于 idleTimeout 则关闭 softEvictConnection() db连接从创建后超过最大存活时长 maxLifeTime 的时候 softEvictConnection() 驱 阅读全文
摘要:
数据库连接池的最小连接为什么是Idle语义 druid的maxEvictableIdleTimeMillis 和 hikariCP 的 maxLifetime HikariCP HikariDataSource初识 HikariPool连接池初始化 Hikari申请db连接的过程 Hikari创建连 阅读全文
摘要:
HikariDataSource#getConnection → HikariPool#getConnection public Connection getConnection(final long hardTimeout) throws SQLException { suspendResumeL 阅读全文
摘要:
在连接关闭 closeConnection() 的时候,会调用 fillPool() 进行填充到 minimumIdle 个连接 HikariPool连接池初始化 在连接池初始化时,会开启HouseKeeper 去定时检查,也会调用 fillPool() 去填充,但是如果 minimumIdle为0 阅读全文
摘要:
HikariCP 是面向 jdbc api 的数据库连接池,所以它肯定实现了 javax.sql.DataSource 接口 public class HikariDataSource extends HikariConfig implements DataSource, Closeable Hik 阅读全文
摘要:
HouseKeeper 和 HikariPool#addBagItem 在需要新增db连接的时候,都是往负责连接创建的线程池 addConnectionExecutor 丢PoolEntryCreator implements Callable<Boolean> 任务 PoolEntryCreato 阅读全文
摘要:
HikariPool 连接池在初始化的时候主要做了几件事: 初始化底层的连接容器 ConcurrentBag checkFailFast() 尝试创建一个db连接,如果失败则直接抛出初始化异常 中断初始化 初始化各类资源 public HikariPool(final HikariConfig co 阅读全文
摘要:
先看看 Druid 的 maxEvictableIdleTimeMillis 是啥? DestroyTask 线程销毁任务每隔 timeBetweenEvictionRunsMillis (默认一分钟)的时间会执行一次连接池瘦身检测 DruidDataSource#shrink(checkTime: 阅读全文
摘要:
druid 的 minIdle -》 maxActive 和 hikariCP 的 minimumIdle -》 maximumPoolSize, 他们都是为了维护连接池内有足够的连接可用, 并且应对一定的流量突增; 这一点和线程池的 corePoolSize =》maxPoolSize 语义类似 阅读全文