除了、、除了必须配置的三个,HikariCP还有一些不必要的配置,包括常用配置和非必要配置。HikariCP 强烈反对向池中添加大量参数配置,会使代码复杂化,迫使用户考虑配置是否必要,导致数据库连接池调整复杂。 Apache DBCP有40多个池属性,但估计90%用于实际生产DBCP性能和可靠性没有正确调整。
1.常用配置
常用配置有 让我们来看看他们都有什么,他们都做什么,默认值是什么。 该属性控制默认自动提交从池返回连接的事务行为。它是一个布尔值,默认值:true。 该属性控制客户端(即用户程序)等待池中连接的最长毫秒。如果超过此时间没有连接,则将被抛出SQLException异常。最低可接受连接超时250毫秒。 默认值:30000(30秒)。这是一个非常重要的问题调查指标。 该属性控制连接允许最大时间闲置在池中。此设置仅适用于 minimumIdle 定义为比 maximumPoolSize 小的时候。 一旦池到达minimumIdle连接时,空闲连接不会 退役。连接是否空闲而退役的最大变化为 30秒,平均变化为 15秒。在这个加班之前,连接永远不会因为空闲而退值0意味着空闲连接永远不会从池中删除,即永远不会加班。 minimum允许的最小值为10000毫秒(10秒)。默认值(10分钟)。 在繁忙的数据库连接池中,连接可能永远无法实现idleTimeout。 然而,许多防火墙和负载平衡器(通常位于应用程序和数据库之间)会占用套接字的生存周期。idleTimeout无论当前流量如何,都会切断连接。 HikariCP 在设计之初,不支持空闲连接检测 test-while-idle,这是因为数据库管理员 DBA默认设置数据库的最长连接时间为60秒,test-while-idle对数据库进行不必要的查询, 这可能会导致数据库空闲连接超时。在HikariCP在旧版本中,maxLifetime由管家线程HouseKeeper强制执行,每30秒执行一次,因为wait_timeout推荐减去30秒。 maxLifetime。但是最新版本的HikariCP对每个连接connection专用计时器任务提供了几十毫秒的时间间隔(在高负载下几秒)maxLifetime安全设置 为wait_timeout减去5秒。如果连接退出,将添加后台线程,创建约5毫秒的新连接。maxLifetime是60秒,那么idleTimeout可设置为0。 maxLifetime 该属性用于控制池中连接的最大生命周期。使用中的连接永远不会退休,只有关闭后才会被移除。HikariCP 它不会让所有的连接同时退休,而是巧妙地为每个连接设轻微的负衰减值,以避免池中的连接大规模消亡。 HikariCP作者强烈建议用户设置此值,应比任何数据库或基础设施实施的连接时间限制短几秒。当然,这取决于最大生存期(无限生存期) idleTimeout 设置。默认值为1.8万(30分钟)。 默认加班30分钟是非常合理的,因为在应用程序和许多数据库之间会有高可用代理、负载平衡、防火墙等,这些组件通常会自动独立终止30分钟的连接。互联网上有很多关于数据库通信异常的问题,最终发现这些问题基本上是由这些组件引起的。此外,由于连接连接通常需要几毫秒,由于一些方差因素,退休和重建连接实际上是不可测量的。当然,maxLifetime 在许多情况下,它也可以作为数据库连接池的核心指标进行调整。 有些使用 MySQL 应用程序将报告以下错误:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
这个问题分为两种情况,是立即还是一段时间后?如果是一段时间后 发生,一般是因为数据库的wait_timeout小于HikariCP的maxLifetime值,此时可将maxLifetime 设置缩短到 900 000毫秒(15分钟);当然,更好的方法是确定 MySQL 配置的wait_timeout值是什么,并将HikariCP 设置为比 maxLifetime 短几分钟。 同样,还有一个经典Communications link failure问题也与参数密切相关,描述如下: com.mysq1.jdbc.exceptions.jdbc4.communicationsException:Communications link failure The last packet successfully received from the server was 13,529 milliseconds ago. The last packet sent successfully to the server was 13,529 milliseconds ago. maxLifetime也可以设置为15分钟或比数据库时间短(例如)MySQL的wait_timeout属性),这和minimumIdle和IdleTimeout这两个参数的设置没有太大的相关性。通过这种调整 HikariCP 在数据库断开连接之前终止连接。如果要提高池中连接更换的速度,可以降低 maxLifetime值(默认为30分钟),但不建议设定在5分钟以下。 若驱动程序支持JDBC4.建议不要设置此属性。这适用于不支持JDBC4的Connection.isValid()遗留驱动程序API。这是在数据库连接池给出连接之前检测和查询,以验证与数据库的连接是否仍然存在和有效。同样,如果您的驱动程序不支持,如果您的驱动程序不支持尝试运行数据库连接池,则不配置该属性JDBC4,那么HikariCP将报错。该属性默认值:无。 请注意,如果您追求终极性能,建议不要配置该属性,因为它将在不配置时通过ping 命令连接检测,性能会更高。经过小规模测试,原生的ping命令性能是select的1倍左右。 minimumIdle 大致相当于 BoneCP 中的 minConnectionsPerPartition 参数。此属性控制 HikariCP 尽量保持池中最小的空闲连接数。如果空闲连接数低于此值,池中的总连接数小于maximumPoolSize,则HikariCP尽量快速有效地添加其他连接。然而,为了最大限度地提高性能和应对峰值需求的能力,HikariCP作者建议不要设置这个值,而是允许它HikariCP充当固定大小的连接池(如果minimumldle默认为未设置 是maximumPoolSize,因此即使idleTimeout 设置为1分钟,一旦连接关闭,也会在池中更换)。如果设置此值,则设置此值HikariCP 它将是一个大小可变的池,通过 minimumIdle调解控制,即使使用情况上下浮动,HikariCP也会保持minimumldle连接可用。 minimumIdle 的默认值与 maximumPoolSize 相同。 minimumIdle 应该总是小于或等于 maximumPoolSize。 如果minimumIdle设置为更高的值,maximumPoolSize 将被推高到等值。minimumIdle 逻辑上不能超过 maximumPoolSize, 因为maximumPoolSize最大数量的后端数据库实际连接。 如果有比 minimumldle 此时,如果一个连接退役,它将不会自动更换。但如果数据库连接池配置为固定尺寸,或连接关闭后的空闲连接小于minimumIdle 的数量,那么就会立即自动替换被关闭的连接。启用 HikariCP 的 metrics 连接的直方图可以直观地显示在可视化界面上,有利于用户研究和确定正确合理的方图minimumIdle 值及 idleTimeout 值。数据库连接池的优化最好基于经验数据,具体问题 分析。 该属性控制数据库连接池连接数允许的最大值,包括空闲连接和正在使用的连接。 本上,此值将决定数据库后端实际连接的最大数量。该属性的合理值最好由用户的执行环 当池达到这个大小,没有空闲连接时,对 getConnection0的调用会阻塞超时 前 connectionTimeout 毫秒。关于连接池的大小。 PoolSize请注意本章的后续内容。 属性默认值:10。 该属性仅在编程配置或IoC容器中可用。该属性允许用户指定池使用的Codahale/Dropwizard实例MetricRegistry,来记录各种度量标准。如果用户需要使用Prometheus等监控,还需要做一些操作。 该属性的默认值:无。 该属性仅在编程配置或IoC容器中可用。该属性允许用户指定池使用的Codahale/Dropwizard实例HealthCheckRegistry,来报告当前系统的健康信息。该属性的默认值:无。 该属性表示连接池的用户定义名称,主要显示在日志记录和JMX管理控制台中,以标识池和池配置。该属性的默认值:自动生成。 这个配置在HikariCP 多个Datasource及监控的过程中非常有用,拥有poolName的HikariCP 监控远比 pool1、pool2、pool3 更容易帮助我们发现、分析、定位及解决问题。
2.非常用配置
非常用配置主要有15个,此外还有一些HikariCP官方文档没有记载、用于调试的极为不常用的“隐藏属性”。虽然在日常实际工作中我们并不一定会用到HikariCP的这些配置,但是在用到一些高级特性时,这些配置是可以发挥出巨大作用的。比如在故障注人演习的时候,allowPoolSuspension就可以支持一些故障转移自动化的方案;registerMbeans 属性在JMX监控中一定要打开并设置为true;再比如 leakDetectionThreshold 是检测 HikariCP 连接池泄露的利器。 如果池无法成功初始化连接,则此属性控制池是否“快速失败”。当该属性为正数时,该值为尝试获取初始连接的毫秒数。在此期间,应用程序线程将被阻塞。如果在超时发生之前无法获取连接,则将引发异常。initializationFailTimeout超时发生在connectionTimeout阶段之后。如果值为0,HikariCP将尝试获取并验证连接。如果获得连接但验证失败,则抛 出异常,而不会启动池。但是,如果无法获得连接,则池将启动,但稍后获取连接的尝试会失败。小于0的值将绕过任何初始连接尝试,并且池将尝试在后台获取连接时立即启动。 因此,以后获得连接的尝试可能会失败。该值的默认值:1。 此属性决定HikariCP是否在自己的事务中隔离内部池查询,例如连接存活测试。由于这些查询通常是只读查询,因此很少有必要将它们封装在自己的事务中。此属性仅在autoCommit 禁用时适用。默认值:false。 此属性控制池是否可以通过JMX挂起和恢复。这对某些故障转移自动化方案很有用。当池被挂起时,调用 getConnection()将不会超时,并将一直保持到池恢复为止。默认值:false。 此属性控制默认情况下从池中获取的Connections是否处于只读模式。注意,某些数据库不支持只读模式的概念,而其他数据库在Connection设置为只读时提供查询优化功能。是否需要此属性将在很大程度上取决于用户的应用程序和数据库。默认值:false。 此属性控制是否注册JMX以管理Bean(MBean)。默认值:false。 贴出一段通过jmx监控连接池的代码
@Component
public class HikariLogUtil {
private static Logger logger = LoggerFactory.getLogger(HikariLogUtil.class);
@Scheduled(fixedRate = 5000)
public void HikariMonitor() throws MalformedObjectNameException {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (设置的poolname)");
HikariPoolMXBean poolProxy = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class);
if (poolProxy == null) {
logger.info("Hikari not initialized,please wait...");
} else {
logger.info("HikariPoolState = "
+ "Active=[" + String.valueOf(poolProxy.getActiveConnections() + "] "
+ "Idle=[" + String.valueOf(poolProxy.getIdleConnections() + "] "
+ "Wait=[" + poolProxy.getThreadsAwaitingConnection() + "] "
+ "Total=[" + poolProxy.getTotalConnections() + "]"
+ "Time=[" + new Date() + "]")));
}
}
}
此属性为支持catalog的数据库设置默认catalog。如果未指定此属性,则使用JDBC驱动程序定义的默认catalog。 默认值:driver default。 此属性设置一个SQL语句,该语句将在每次创建新连接之后执行,然后再将该连接添加到池中。如果此SQL无效或抛出异常,则被视为连接失败,并将遵循标准重试逻辑。默 认值:无。 HikariCP将尝试仅基于jdbcUrl通过DriverManager解析驱动程序,但对于某些较旧的驱动程序必须指定driverClassName。除非用户收到明显的错误消息,表明未找到驱动程序,否则可忽略此属性。默认值:无。 此属性控制从池返回的连接的默认事务隔离级别。若未指定,则用JDBC驱动程序定义的默认事务隔离级别。仅当有针对所有查询的特定隔离需求时,才使用此属性。此属性的值是Connection类的常量名,如TRANSACTION_READ_COMMITTED、 TRANSACTION_REPEATABLE_READ 等。默认值:driver default。 此属性控制连接测试活性的最长时间。该值必须小于connectionTimeout。最低可接受的验证超时为 250 毫秒。默认值:5000。 此属性控制连接在记录一条指示可能连接泄露的消息之前流出池的时间。值为0表示禁用泄露检测。启用泄露检测的最低可接受值是2000毫秒(2秒)。默认值:0。 此属性仅可通过编程配置或IoC容器获得。此属性允许用户直接设置DataSource要由池包装的实例,而不是让HikariCP通过反射构造该实例。这在一些依赖注入框架中很有用。指定此属性后,dataSourceClassName将忽略该属性和所有特定于DataSource的属性。 默认值:无。 该属性为支持schema概念数据库设置默认schema,如果未指定此属性,则使用JDBC驱动程序定义的默认模式。默认值:driver default。 此属性仅可通过编程配置或IoC容器获得。通过配置该属性自定义设置java.util.concurrent.ThreadFactory的实例,可创建池使用的所有线程的实例。这个属性在某些受限制的环境中使用,在这些环境中,线程只能通过应用容器提供的 ThreadFactory 创建。默认值:无。 仅可通过编程配置或IoC容器获得。通过该属性自定义设置java.util.concurrent.Scheduled-ExecutorService的实例,可实例化各种内部调度任务。如果向HikariCP提供ScheduledThread- PoolExecutor实例,建议设置 setRemoveOnCancelPolicy(true)。默认值:无。
.