在大量闲置连接时,最大连接被奇怪地炸毁

问题描述 投票:1回答:2

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

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

我正在使用@Autowired连接存储库并将其传递给数百个将要搜索并保存到数据库的线程。

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

enter image description here

问题

  1. 为什么连接如此之高而空闲几乎占用了整个连接?
  2. 每个操作都在Hibernate中,我会创建一个连接吗?任何正式的文件来详细说明这个设计?
  3. 在Hibernate中有什么方法我可以释放空闲吗?
  4. 或者实际上还有另一个我要研究的地方而不是Hibernate?

更新

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

任何帮助将不胜感激 ;)

hibernate spring-boot jpa postgresql-9.4
2个回答
1
投票

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

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

您可以通过设置minimumIdle属性来配置最小空闲连接数。默认情况下,这与maximumPoolSize相同,而spring.datasource.hikari.*默认为10.这意味着Hikari默认会尝试保持10个连接,无论是空闲还是空闲。

在Spring引导中,您可以使用spring.datasource.hikari.minimumIdle=10 spring.datasource.hikari.maximumPoolSize=10 前缀配置HikariCP属性,例如:

relevant documentation

引用maximumPoolSize

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

正如您所看到的,建议不要更改此行为,因此,如果您的应用程序未使用,则使用HikariCP查看大量空闲连接是很正常的。但是,除非另有配置,否则每个应用程序最多应使用10个连接。他们还建议尽可能降低最大池大小,如idleTimeout文章中所述。

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


1
投票

在@ g00glen00b的帮助下,我检查了Spring Boot依赖项,发现maxIdle & minEvictableIdleTimeMillis实际上是由Spring Boot使用的。

tomcat使用maxActive: 100属性来控制允许多少空闲连接以及在被驱逐之前它们可以保留多长时间。它的默认值是spring.datasource.tomcat.max-idle=50,它直接解释了一切。

在Spring Boot中,您可以将此属性作为qazxswpoi进行管理。

但正如@ g00glen00b所提到的,也许直接管理这个可能会损害性能的值并不好。基于系统本身的清晰意图应该非常谨慎地使用它。

在我的情况下,我没有触摸它们,我重构了我的java代码来缓存数据以减少java端的连接。

© www.soinside.com 2019 - 2024. All rights reserved.