建设部网站中煤三建,什么网站可以做进出口买卖,网络营销网站建设培训,衣柜 技术支持 东莞网站建设SpringBoot第35讲#xff1a;SpringBoot集成连接池 - 默认连接池HikariCP 本文是SpringBoot第35讲#xff0c;主要介绍数据库连接池#xff0c;以及SpringBoot集成默认的HikariCP的实践。 文章目录 SpringBoot第35讲#xff1a;SpringBoot集成连接池 - 默认连接池HikariCP1…SpringBoot第35讲SpringBoot集成连接池 - 默认连接池HikariCP 本文是SpringBoot第35讲主要介绍数据库连接池以及SpringBoot集成默认的HikariCP的实践。 文章目录 SpringBoot第35讲SpringBoot集成连接池 - 默认连接池HikariCP1、知识准备1.1、什么是数据库连接池1.2、数据库连接池基本原理1.3、有哪些常见的数据库连接池 2、简单示例 (商品中心采用的方案)3、进一步理解3.1、SpringBoot2默认连接池HikariCP是如何起作用的3.2、更多HikariCP配置参数3.3、为什么HikariCP会成为默认连接池3.4、更多常见的使用问题 4、源码示例 1、知识准备 需要理解数据库连接池的基本原理Java DataSource规范常见的连接池等。部分内容整理自百度百科 1.1、什么是数据库连接池 什么是连接池它要解决什么样的问题呢 数据库连接池负责分配、管理和释放数据库连接它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接 而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
1.2、数据库连接池基本原理
连接池基本的思想是在系统初始化的时候将数据库连接作为对象存储在内存中当用户需要访问数据库时并非建立一个新的连接而是从连接池中取出一个已建立的空闲连接对象。使用完毕后用户也并非将连接关闭而是将连接放回连接池中以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素
最小连接数
是连接池一直保持的数据库连接所以如果应用程序对数据库连接的使用量不大将会有大量的数据库连接资源被浪费。
最大连接数
是连接池能申请的最大连接数如果数据库连接请求超过此数后面的数据库连接请求将被加入到等待队列中这会影响之后的数据库操作。
最小连接数与最大连接数差距
最小连接数与最大连接数相差太大那么最先的连接请求将会获利之后超过最小连接数量的连接请求 等价于建立一个新的数据库连接。不过这些大于最小连接数的数据库连接在使用完不会马上被释放它将被放到连接池中等待重复使用 或是空闲超时后被释放。
1.3、有哪些常见的数据库连接池 开源的数据库连接池众多这里我们需要了解曾经常用的开源数据库连接池及其被淘汰原因并了解目前最常用的数据库连接池。 C3P0(被淘汰历史悠久过于复杂性能差)
是一个开放源代码的JDBC连接池它在lib目录中与Hibernate一起发布包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。由于一度是Hibernate内置的数据库连接池而被开发者熟知但是由于性能和复杂度官方已经放弃维护。
DBCP被淘汰依赖Commons-Pool性能差 DBCPDataBase Connection Pool属于Apache顶级项目Commons中的核心子项目。但DBCP并不是独立实现连接池功能的它内部依赖于Commons-Pool项目连接池最核心的“池”就是由Commons-Pool组件提供的因此DBCP的性能实际上就是Pool的性能。
终于在tomcat 7.0版本中tomcat重新设计开发出了一套连接池Tomcat JDBC Pool并且于13年9月发布了Commons-Pool 2.0。命脉已经更新的DBCP终于在14年2月份发布了DBCP2.0。但是毕竟由于长时间没有更新突破的DBCP已经被人放弃了。
BoneCP被淘汰为解决C3P0/DBCP性能而生后续出现了更高性能的hikariCPBoneCP也不再更新
是一个快速、开源的数据库连接池。帮用户管理数据连接让应用程序能更快速地访问数据库。
BoneCP的出现主要是为了解决C3P0/DBCP连接池性能问题有一些测试表明其性能提升了25倍。
后来出现了更高性能的hikariCPBoneCP也不再更新所以BoneCP目前也很少被使用。
Druid
Druid功能最为全面sql拦截等功能统计数据较为全面具有良好的扩展性
2、简单示例 (商品中心采用的方案) 主要展示HikariCP的使用配置等。 如下是常用的HikariCP的使用配置(Springboot 默认连接池)
spring:datasource:url: jdbc:mysql://localhost:3306/db_user?useSSLfalseautoReconnecttruecharacterEncodingutf8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: qwj930828# 指定为HikariDataSourcetype: com.zaxxer.hikari.HikariDataSource# hikari连接池配置hikari:#连接池名pool-name: HikariCP#最小空闲连接数minimum-idle: 5# 空闲连接存活最大时间默认10分钟idle-timeout: 600000# 连接池最大连接数默认是10maximum-pool-size: 10# 此属性控制从池返回的连接的默认自动提交行为,默认值trueauto-commit: true# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟max-lifetime: 1800000# 数据库连接超时时间,默认30秒connection-timeout: 30000# 连接测试queryconnection-test-query: SELECT 13、进一步理解 通过如下几个问题进一步理解HikariCP。 3.1、SpringBoot2默认连接池HikariCP是如何起作用的 从SpringBoot自动初始化配置 和 默认的数据源 两个角度理解。 SpringBoot自动初始化配置
关键代码如下
然后可以找到HikariCP数据源的配置 你可以发现为了支持动态更新配置基于MXBean)这里还设计了一层HikariConfigMXBean接口
为什么说是默认的数据源呢
首先springboot-starter-jdbc中默认加载了Hikari 其次在配置初始化或者加载时都是第一个被加载的
private static T extends DataSource MappedDataSourcePropertiesT lookupPooled(ClassLoader classLoader,ClassT type) {MappedDataSourcePropertiesT result null;result lookup(classLoader, type, result, com.zaxxer.hikari.HikariDataSource,HikariDataSourceProperties::new);result lookup(classLoader, type, result, org.apache.tomcat.jdbc.pool.DataSource,TomcatPoolDataSourceProperties::new);result lookup(classLoader, type, result, org.apache.commons.dbcp2.BasicDataSource,MappedDbcp2DataSource::new);result lookup(classLoader, type, result, oracle.ucp.jdbc.PoolDataSourceImpl,OraclePoolDataSourceProperties::new, oracle.jdbc.OracleConnection);return result;
}3.2、更多HikariCP配置参数
从代码的角度你已经可以看到可以配置如下属性 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;private boolean isAutoCommit;private boolean isReadOnly;private boolean isIsolateInternalQueries;private boolean isRegisterMbeans;private boolean isAllowPoolSuspension;private DataSource dataSource;private Properties dataSourceProperties;private ThreadFactory threadFactory;private ScheduledExecutorService scheduledExecutor;private MetricsTrackerFactory metricsTrackerFactory;private Object metricRegistry;private Object healthCheckRegistry;private Properties healthCheckProperties;private long keepaliveTime;private volatile boolean sealed;更具体的可以看官方配置 或者参考这篇博客深蓝Blog总结翻译的配置
属性描述构造器默认值默认配置validate之后的值validate重置autoCommit自动提交从池中返回的连接TRUETRUE–connectionTimeout等待来自池的连接的最大毫秒数SECONDS.toMillis(30) 3000030000如果小于250毫秒则被重置回30秒idleTimeout连接允许在池中闲置的最长时间 MINUTES.toMillis(10) 600000600000如果idleTimeout1秒maxLifetime 且 maxLifetime0则会被重置为0代表永远不会退出如果idleTimeout!0且小于10秒则会被重置为10秒maxLifetime池中连接最长生命周期MINUTES.toMillis(30) 18000001800000如果不等于0且小于30秒则会被重置回30分钟connectionTestQuery如果您的驱动程序支持JDBC4我们强烈建议您不要设置此属性nullnull–minimumIdle池中维护的最小空闲连接数-110minIdle0或者minIdlemaxPoolSize,则被重置为maxPoolSizemaximumPoolSize池中最大连接数包括闲置和使用中的连接-110如果maxPoolSize小于1则会被重置。当minIdle0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle0则重置为minIdle的值metricRegistry该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例供池使用以记录各种指标nullnull–healthCheckRegistry该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息nullnull–poolName连接池的用户定义名称主要出现在日志记录和JMX管理控制台中以识别池和池配置nullHikariPool-1–initializationFailTimeout如果池无法成功初始化连接则此属性控制池是否将 fail fast11–isolateInternalQueries是否在其自己的事务中隔离内部池查询例如连接活动测试FALSEFALSE–allowPoolSuspension控制池是否可以通过JMX暂停和恢复FALSEFALSE–readOnly从池中获取的连接是否默认处于只读模式FALSEFALSE –registerMbeans是否注册JMX管理BeanMBeansFALSEFALSE –catalog为支持 catalog 概念的数据库设置默认 catalog driverdefaultnull–connectionInitSql该属性设置一个SQL语句在将每个新连接创建后将其添加到池中之前执行该语句。nullnull–driverClassNameHikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序但对于一些较旧的驱动程序还必须指定driverClassNamenullnull–transactionIsolation控制从池返回的连接的默认事务隔离级别nullnull–validationTimeout连接将被测试活动的最大时间量SECONDS.toMillis(5) 50005000如果小于250毫秒则会被重置回5秒leakDetectionThreshold记录消息之前连接可能离开池的时间量表示可能的连接泄漏00如果大于0且不是单元测试则进一步判断(leakDetectionThreshold SECONDS.toMillis(2) or (leakDetectionThreshold maxLifetime maxLifetime 0)会被重置为0 . 即如果要生效则必须0而且不能小于2秒而且当maxLifetime 0时不能大于maxLifetimedataSource这个属性允许你直接设置数据源的实例被池包装而不是让HikariCP通过反射来构造它nullnull–schema该属性为支持模式概念的数据库设置默认模式 driverdefaultnull–threadFactory此属性允许您设置将用于创建池使用的所有线程的 java.util.concurrent.ThreadFactory的实例。nullnull–scheduledExecutor此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例nullnull–
3.3、为什么HikariCP会成为默认连接池 官网详细地说明了 HikariCP 所做的一些优化总结如下 字节码精简 优化代码直到编译后的字节码最少这样CPU缓存可以加载更多的程序代码优化代理和拦截器减少代码例如HikariCP的Statement proxy只有100行代码只有BoneCP的十分之一自定义数组类型FastStatementList代替ArrayList避免每次get()调用都要进行range check避免调用remove()时的从头到尾的扫描自定义集合类型ConcurrentBag)提高并发读写的效率其它针对BoneCP缺陷的优化比如对于耗时超过一个CPU时间片的方法调用的研究等。
更多可以参考Down the Rabbit Hole
3.4、更多常见的使用问题
请参考 官方WIKI - FAQ
4、源码示例
todo
springBoot默认HikariDataSource配置 文章转载自: http://www.morning.qbpqw.cn.gov.cn.qbpqw.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.lkbkd.cn.gov.cn.lkbkd.cn http://www.morning.hlshn.cn.gov.cn.hlshn.cn http://www.morning.xlbyx.cn.gov.cn.xlbyx.cn http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn http://www.morning.cwgfq.cn.gov.cn.cwgfq.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.bfjyp.cn.gov.cn.bfjyp.cn http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn http://www.morning.fqpyj.cn.gov.cn.fqpyj.cn http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn http://www.morning.wsnjn.cn.gov.cn.wsnjn.cn http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn http://www.morning.bxqpl.cn.gov.cn.bxqpl.cn http://www.morning.qshxh.cn.gov.cn.qshxh.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.ysckr.cn.gov.cn.ysckr.cn http://www.morning.fnmtc.cn.gov.cn.fnmtc.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.tsrg.cn.gov.cn.tsrg.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.pyncm.cn.gov.cn.pyncm.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.hdlhh.cn.gov.cn.hdlhh.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.fqsxf.cn.gov.cn.fqsxf.cn http://www.morning.qljxm.cn.gov.cn.qljxm.cn http://www.morning.smygl.cn.gov.cn.smygl.cn http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn http://www.morning.wjfzp.cn.gov.cn.wjfzp.cn http://www.morning.kxxld.cn.gov.cn.kxxld.cn http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.rgfx.cn.gov.cn.rgfx.cn http://www.morning.rytps.cn.gov.cn.rytps.cn http://www.morning.tsmcc.cn.gov.cn.tsmcc.cn http://www.morning.hqwcd.cn.gov.cn.hqwcd.cn http://www.morning.jwwfk.cn.gov.cn.jwwfk.cn http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.cszbj.cn.gov.cn.cszbj.cn http://www.morning.mdmc.cn.gov.cn.mdmc.cn http://www.morning.jkzq.cn.gov.cn.jkzq.cn http://www.morning.htpjl.cn.gov.cn.htpjl.cn http://www.morning.hbywj.cn.gov.cn.hbywj.cn http://www.morning.cykqg.cn.gov.cn.cykqg.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.dhtdl.cn.gov.cn.dhtdl.cn http://www.morning.fbccx.cn.gov.cn.fbccx.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.mtrfz.cn.gov.cn.mtrfz.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.rnmmh.cn.gov.cn.rnmmh.cn http://www.morning.hkchp.cn.gov.cn.hkchp.cn http://www.morning.errnull.com.gov.cn.errnull.com http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.prsxj.cn.gov.cn.prsxj.cn http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.qngcq.cn.gov.cn.qngcq.cn http://www.morning.wglhz.cn.gov.cn.wglhz.cn http://www.morning.qyrnp.cn.gov.cn.qyrnp.cn http://www.morning.gkjyg.cn.gov.cn.gkjyg.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.ygrkg.cn.gov.cn.ygrkg.cn http://www.morning.srnhk.cn.gov.cn.srnhk.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.rmyt.cn.gov.cn.rmyt.cn http://www.morning.qphcq.cn.gov.cn.qphcq.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.sxfmg.cn.gov.cn.sxfmg.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn