高性能数据库链接池HikariCP原理分析1.1

数据库连接池的产生背景

传统的单一数据库连接设计场景存在的弊端

传统的连接池函数可以表示为f(y)=kx,y表示资源消耗率,k表示连接次数,x表示连接动作(长连接),每次链接都会消耗一次资源,尤其是在高并发场景下,很快就会出现连接溢出(LIM(connectionTimes)=MAX(max_of_connections))。
如果数据库链接在一秒钟内产生了100000个链接,明显数据库会watting甚至crash的。这是非常不科学的

对比图
数据库连接池的产生背景

传统的单一数据库连接设计场景存在的弊端

传统的连接池函数可以表示为f(y)=kx,y表示资源消耗率,k表示连接次数,x表示连接动作(长连接),每次链接都会消耗一次资源,尤其是在高并发场景下,很快就会出现连接溢出(LIM(connectionTimes)=MAX(max_of_connections))。
如果数据库链接在一秒钟内产生了100000个链接,明显数据库会watting甚至crash的。这是非常不科学的

对比图
对比 (1).png

所以链接池合理设计应该是具备动态规划性的
其转移方程应该是:
size=maxPoolSize
idelSize=idel of poolSize
ConcurrentBag=C
When idelSize>0 then do dp[i]=C.borrow(state_in_closed_connection) from poolEntry;
When idelSize=0 and poolSize<maxPoolSize then do dp[i]=C.borrow(state_in_closed_connection) from poolEntry;
else waitting do waiters.increAndGet()

链接池可以有效利用资源,并可以科学地管理链接句柄。
Mysql数据库场景下的链接池模拟图

pooled_compare_nopooled.png

链接池的面向对象设计模版大概是
1.代理Connection对象
2.代理Statement对象
3.PooledConection池华对象
4.metrics性能监控模块
5. 并发锁机制
6.SqlParser部分
7.更高级的机器学习自动优化链接池的最大链接数,最大等待激活connection时间,最小闲置链接数等。

HikariCP数据库是嵌入在Spring-framework里的最优数据库连接池,麻雀虽小,五脏俱全。并发能力较其他连接池优秀,还有比较完善的性能监控以日志的形式输出。

config参数有如下

参数 描述 默认值 其他
autoCommit 自动提交从池中返回的连接 。 true -
connectionTimeout 等待来自池的连接的最大毫秒数 30000 如果小于250毫秒,则被重置回30秒
idleTimeout 连接允许在池中闲置的最长时间 600000 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒
maxLifetime 池中连接最长生命周期 1800000 池中连接最长生命周期
connectionTestQuery 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 null -
minimumIdle 池中维护的最小空闲连接数 10 minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize
maximumPoolSize 池中最大连接数,包括闲置和使用中的连接 10 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值
metricRegistry 该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例,供池使用以记录各种指标 null -
healthCheckRegistry 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 null -
poolName 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 HikariPool-1 -
initializationFailTimeout 如果池无法成功初始化连接,则此属性控制池是否将 fail fast 1
isolateInternalQueries 是否在其自己的事务中隔离内部池查询,例如连接活动测试 false -
allowPoolSuspension 控制池是否可以通过JMX暂停和恢复 false -
readOnly 从池中获取的连接是否默认处于只读模式 false -
registerMbeans 是否注册JMX管理Bean(MBeans) false -
catalog 为支持 catalog 概念的数据库设置默认 catalog false -
connectionInitSql 该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 null -
driverClassName HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName。 null -
transactionIsolation 控制从池返回的连接的默认事务隔离级别 null -
validationTimeout 连接将被测试活动的最大时间量 5000 -
leakDetectionThreshold 记录消息之前连接可能离开池的时间量,表示可能的连接泄漏 0 如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime
dataSource 这个属性允许你直接设置数据源的实例被池包装,而不是让HikariCP通过反射来构造它 null -
schema 该属性为支持模式概念的数据库设置默认模式,支持SQL Script初始化执行 null -
threadFactory 此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。 null -
scheduledExecutor 此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例 。 null -
HikariConfig Implements HikariConfigMXBean

设计上是要支持JMX

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。可以支持远程链接配置信息,比如JNI-DataSource

   private volatile String catalog;
   private volatile long connectionTimeout;
   private volatile long validationTimeout;
   private volatile long idleTimeout;
   private volatile long leakDetectionThreshold;
   private volatile long maxLifetime;
   private volatile int maxPoolSize;
   private volatile int minIdle;
   private volatile String username;
   private volatile String password;

   // Properties NOT changeable at runtime
   //
   private long initializationFailTimeout;
   private String connectionInitSql;
   private String connectionTestQuery;
   private String dataSourceClassName;
   private String dataSourceJndiName;
   private String driverClassName;
   private String exceptionOverrideClassName;
   private String jdbcUrl;
   private String poolName;
   private String schema;
   private String transactionIsolationName
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值