数据库连接池的产生背景
传统的单一数据库连接设计场景存在的弊端
传统的连接池函数可以表示为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的。这是非常不科学的
对比图
所以链接池合理设计应该是具备动态规划性的
其转移方程应该是:
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数据库场景下的链接池模拟图
链接池的面向对象设计模版大概是
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