【问题标题】:Max connection is weirdly blown up while lots of idle connections最大连接被奇怪地炸毁了,而大量的空闲连接
【发布时间】:2019-03-20 08:36:04
【问题描述】:

我已经检查了 max available connection 应该是 97,因为我的 max_connection 是 100superuser_reserved_connections 默认是 3。

我正在使用hibernate-envers 5.2.3.FinalSpring Boot 1.5.2.RELEASE 来管理数据库操作。

我正在使用@Autowired 连接存储库并将其传递给数百个线程,这些线程将从数据库中搜索并保存到

连接异常提示我,但是当我通过pgAdmin4检查连接时

问题

  1. 为什么连接如此之高,而idle几乎占据了整个连接?
  2. 是不是在Hibernate中的每一个操作,我都会创建一个连接?有没有官方文档来详细说明这个设计?
  3. 在 Hibernate 中有什么方法可以释放空闲的吗?
  4. 或者实际上我应该研究另一个地方来代替 Hibernate?

更新

我通过缓存 java 代码中的数据以避免频繁搜索和保存解决了这个问题,但上面的问题仍然存在。

任何帮助将不胜感激;)

【问题讨论】:

  • 空闲连接是您的连接池创建并保留以供重复使用的连接。如果您发现它们没有被重复使用但总是创建新连接,则您的应用程序中存在错误并且您的代码无法正确返回不再使用的连接到连接池。
  • 感谢帮助 :) 但问题是我没有看到周围的连接池....太尴尬了,我只是直接使用休眠和 Spring Boot 并连接到本地数据库。跨度>
  • 哇,看起来很棒,我明天回到办公室时会检查一下。非常感谢!

标签: hibernate spring-boot jpa postgresql-9.4


【解决方案1】:

在使用 JPA/Hibernate 时,您必须设置 DataSource,这通常是使用连接池的实现,因此它不必一直重新创建连接。相反,将使用连接池中的现有连接。

Spring 提供并支持多种实现,例如 HikariCP、DBCP、Tomcat 等。默认情况下,Spring boot 1.x 使用 Tomcat 连接池,而 Spring boot 2.x 使用HikariCP

您可以通过设置minimumIdle 属性来配置空闲连接的最小数量。默认情况下,这与maximumPoolSize 相同,而maximumPoolSize 又默认为10。这意味着Hikari 默认情况下将尝试保持10 个连接,无论是否空闲。

在 Spring boot 中,您可以使用 spring.datasource.hikari.* 前缀配置 HikariCP 属性,例如:

spring.datasource.hikari.minimumIdle=10
spring.datasource.hikari.maximumPoolSize=10

引用relevant documentation

此属性控制 HikariCP 尝试在池中维护的最小空闲连接数。如果空闲连接低于此值并且池中的总连接数小于maximumPoolSize,HikariCP 将尽最大努力快速有效地添加额外的连接。但是,为了获得最大性能和对峰值需求的响应,我们建议不要设置此值,而是允许 HikariCP 充当固定大小的连接池。默认值:与maximumPoolSize相同

如您所见,建议不要更改此行为,因此,如果您使用 HikariCP 在您的应用程序未使用时看到大量空闲连接,这是很正常的。但是,除非另有配置,否则每个应用程序最多应占用 10 个连接。正如About Pool Sizing 文章中所述,他们还建议将最大池大小保持在尽可能低的水平。

此外,您可以通过配置idleTimeout 设置来配置空闲时保持连接的时间。

【讨论】:

    【解决方案2】:

    在@g00glen00b的帮助下,我检查了Spring Boot的依赖关系,发现Tomcat 8.5.11实际上是Spring Boot使用的。

    tomcat 使用属性maxIdle & minEvictableIdleTimeMillis 来控制允许多少空闲连接以及它们在被驱逐之前可以停留多长时间。它的默认值为maxActive: 100,它直接解释了一切。

    在 Spring Boot 中,您可以将该属性管理为spring.datasource.tomcat.max-idle=50

    但是正如@g00glen00b 提到的,直接管理这个值可能不好,这可能会损害性能。应根据系统本身的明确意图谨慎使用它。

    就我而言,我没有碰它们,我重构了我的 java 代码以缓存数据以减少 java 端的连接。

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2022-01-26
      • 2011-12-10
      • 1970-01-01
      • 2011-07-07
      • 2020-04-29
      • 2014-12-04
      • 2019-02-24
      • 2011-11-13
      相关资源
      最近更新 更多