再有人问你数据库连接池 Druid 的原理,这篇文章甩给他!( 四 )


2、应用每次从数据源中获取连接时候,会根据testOnBorrow、testWhileIdle参数检测连接的有效性 。
因此,我们需要重点配置如下的参数:
A、timeBetweenEvictionRunsMillis 参数:间隔多久检测一次空闲连接是否有效 。
B、testWhileIdle 参数:启空闲连接的检测,强烈建议设置为 true。
C、minEvictableIdleTimeMillis 参数:连接池中连接最大空闲时间(毫秒),连接数 > minIdle && 空闲时间 > minEvictableIdleTimeMillis。
D、maxEvictableIdleTimeMillis 参数:连接池中连接最大空闲时间,空闲时间 > maxEvictableIdleTimeMillis,不管连接池中的连接数是否小于最小连接数。
E、testOnBorrow 参数:开启连接的检测,获取连接时检测是否有效,假如设置为 true  , 可以最大程度的保证连接的可靠性,但性能会变很差。

笔者建议在配置这些参数时,和 DBA、架构师做好提前沟通,每个公司的数据库配置策略并不相同,假如数据库配置连接存活时间很短,那么就需要适当减少空闲连接检测间隔 , 并调低最大和最小空闲时间 。
5 总结这篇文章,笔者整理了数据库连接池的知识点 。
1)连接池的优点:资源重用、提高性能、优化资源分配、连接管理;
2)JDBC 连接池:实现数据源接口javax.sql.DataSource,这个类位于 Java 标准库;
3)连接池 Druid 实现原理:
  • 核心方法:初始化、创建连接、获取连接、归还连接、销毁连接 。
  • 存储容器:连接池数组、销毁连接数组、保活连接数组 。
  • 线程模型:独立的创建连接线程和销毁连接线程 。
  • 锁机制:在创建连接、获取连接时 , 都会加锁,通过两个 Condition 对象 empty 、notEmpty 分别控制创建连接线程和获取连接线程的等待和唤醒 。
4)连接池保活策略
配置连接池参数时,和 DBA、架构师做好提前沟通,每个公司的数据库配置策略并不相同,假如数据库配置连接存活时间很短,那么就需要适当减少空闲连接检测间隔,并调低最大和最小空闲时间 。
最后,数据库连接池、线程池都是对象池的思想 。对象池是一种设计模式,用于管理可重复使用的对象 , 以减少对象的创建和销毁开销 。
笔者会在接下来的文章里为大家详解,敬请期待:
  • 如何使用池化框架 Commons Pool ;
参考文章:
https://segmentfault.com/a/1190000043208041
https://blog.csdn.net/weixin_43790613/article/details/133940617
https://blog.csdn.net/yaomingyang/article/details/123145662




推荐阅读