当前位置: 首页 > 知识库问答 >
问题:

hikaricp - HikariCP可以怎么优化?

乐正晟
2024-08-29

项目的数据库连接我是用HikariCP,单个增删查改速度是还算快的。但请求一多,速度就变得很慢很慢了。请问这个可以怎么优化?

然后我是这么配置的

public static HikariDataSource init(){
        hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl("数据库连接");
        hikariDataSource.setUsername("帐号");
        hikariDataSource.setPassword("密码");
        hikariDataSource.setIdleTimeout(30000);
        hikariDataSource.setMaximumPoolSize(20);
        hikariDataSource.setMinimumIdle(10);
        hikariDataSource.setMaxLifetime(120000);
        hikariDataSource.setConnectionTimeout(30000);
        hikariDataSource.addDataSourceProperty("cachePrepStmts", "true");
        hikariDataSource.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariDataSource.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariDataSource.addDataSourceProperty("autoReconnect", "true");
        hikariDataSource.addDataSourceProperty("maxReconnects", "100");
        return hikariDataSource;
    }

共有2个答案

葛昱
2024-08-29

你的 HikariCP 配置看起来基本上是合理的,但如果在高并发情况下性能变得很慢,可能存在一些瓶颈或需要优化的地方。以下是一些可能的优化建议:

1. 调整连接池大小

  • MaximumPoolSize 设置为 20,这个值可能在高并发时不够大。你可以通过分析你的数据库并发负载来调整这个值。通常,MaximumPoolSize 可以设置为 CPU 核心数 * 2 + 有一定余量 的方式,但具体数值还要根据你的实际场景来调整。
  • 如果设置得过大,可能会导致数据库服务器负载过高;设置得过小,又会导致连接不够用。因此,需要找到一个平衡点。

2. 监控连接池使用情况

  • 通过 HikariCP 提供的监控功能(如 HikariPoolMXBean)或其他监控工具,监控连接池的使用情况(如当前活动连接数、等待连接数等)。这样可以帮助你了解是否需要调整连接池配置。

3. 降低 ConnectionTimeout

  • 你设置了 ConnectionTimeout 为 30000 毫秒(30 秒),这意味着在获取连接时如果超过这个时间,才会抛出异常。你可以尝试降低这个值(比如 5-10 秒),这样当连接池中没有可用连接时,系统能够更快地反馈问题。

4. 优化数据库查询

  • 确保数据库查询本身是高效的。检查是否有慢查询,是否需要为某些表添加索引,或者是否需要优化查询语句。
  • 避免在一次查询中加载过多的数据,分批处理大数据量的查询。

5. 数据库连接与资源释放

  • 确保每个数据库操作结束后,连接都被正确关闭和释放。任何未及时关闭的连接都会占用池中的连接资源,从而导致性能下降。

6. 考虑数据库性能

  • 如果你的数据库服务器本身的资源有限(如 CPU、内存、IO 等),它可能无法处理太多并发连接。你可以尝试垂直扩展数据库服务器或进行数据库分片、读写分离等优化。

7. 数据库连接池其他配置

  • IdleTimeout 设置为 30000 毫秒,这表示空闲连接在 30 秒后会被回收。如果你的数据库连接建立和销毁的开销较高,可以尝试增加这个值以减少频繁的连接销毁和重建。
  • MaxLifetime 设置为 120000 毫秒(2 分钟),表示连接的最大生存时间。你可以检查一下数据库服务器的连接超时时间是否与其匹配。

8. 硬件与网络

  • 确保应用服务器和数据库服务器之间的网络通信没有瓶颈。
  • 如果可能,可以升级服务器的硬件配置,特别是内存和存储速度。

9. 调试和日志

  • 打开 HikariCP 的调试日志,观察是否有异常、连接超时或其他问题日志,从而更准确地定位问题。
刘向阳
2024-08-29

MaximumPoolSize设置的太保守了 再就是有可能有没释放的连接

 类似资料:
  • HikariCP 是一个高性能的 JDBC 连接池组件。下图是性能的比较测试结果: 使用方法: HikariConfig config = new HikariConfig();config.setMaximumPoolSize(100);config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");c

  • 我们的项目中有Spring-boot/hibernate/PostgreSQL应用程序,并使用Hikari作为连接池。我们不断遇到以下问题:几个小时后,活动连接数增长到极限,我们得到如下错误(完整堆栈跟踪位于问题的末尾): 以下是版本信息: JPA/Hibernate配置: HikariCP配置: 完整堆栈跟踪:

  • 在Appengine上使用HikariCP作为连接池部署Spring Boot应用程序时,在执行一些请求时,我会遇到一些与数据库(线程)相关的错误: 然后我发现AppEngine只允许应用程序使用它的ThreadFactory创建线程。因此,我确保将Hikari配置为使用AppEngine的线程工厂,如下所示:

  • 问题内容: 借助Cloud SQL,在App Engine上寻找连接池解决方案时,会出现多个条目,并提出HikariCP应该起作用的建议,因为它允许外部ThreadFactory配置。 配置如下所示: 但是有问题。 Google App Engine上的HikariCP 实际上,由于App Engine受限制的“沙盒”环境,快速尝试暴露了多个问题。 所以问题仍然存在。 有人成功在Google Ap

  • 我尝试使用HikariCP和mariaDB数据库,但是当我尝试初始化的时候,我得到了下一个错误。 由以下原因引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 我的MariaDBDatabase类: 我的数据库类: 我的家伙.xml

  • 在模拟网络连接失败几秒钟的情况下,尝试暂停HikariCP池时会引发异常。为什么泳池可以不可以暂停?有没有其他简单的方法来模拟丢失的网络连接(到本地主机上的MySQL服务器)? 配置: 属性: JUnit: 例外

  • 我正在开发一个在Java服务器上运行的游戏。对于数据库池,我使用的是HikariCP,这是一个优秀的库,但它现在抛出了以下错误: 现在我知道连接泄漏意味着打开的连接在某个地方漂浮,但我不知道如何或在哪里漂浮。 下面是我的数据库类中的一个方法,根据堆栈跟踪,错误应该发生在这里。 这只是启动语句的一个基本方法。调用它时,我使用它,然后调用、和 但它告诉我连接是打开的。 我怎么解决这个?谢了!

  • 我注意到,即使数据库关闭,因此池中实际上没有可用的连接,Hikari CP仍然会等待连接超时到期,然后再向客户端发送异常。 我同意当数据库可用时这是可取的,但在我的情况下,我希望池在没有连接可用时不要等待发送异常。 原因是数据库本身在不到2ms的时间内回答,所以我每秒可以处理数千个事务,但是当没有可用的连接时,池将等待更长的时间(建议的最小可接受超时为250毫秒),因此我无法再处理吞吐量。另一方面