最大连接数被怪异地炸毁,而许多空闲连接数

时间:2019-03-20 08:36:04

标签: hibernate spring-boot jpa postgresql-9.4

我检查了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代码中的数据来避免频繁的搜索和保存,从而解决了该问题,但是上面的问题仍然存在。

任何帮助将不胜感激;)

2 个答案:

答案 0 :(得分:1)

使用JPA /休眠时,您必须设置一个DataSource,它通常是一个使用连接池的实现,因此不必始终重新创建连接。而是从连接池获取现有连接。

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

您可以通过设置minimumIdle属性来配置最小的空闲连接数。默认情况下,它与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设置来配置空闲时连接保持多长时间。

答案 1 :(得分:1)

在@ 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端的连接。