我已经检查了max available connection应该是97因为我的max_connection是100而superuser_reserved_connections
默认是3。
我正在使用hibernate-envers 5.2.3.Final和Spring Boot 1.5.2.RELEASE来管理数据库操作。
我正在使用@Autowired
连接存储库并将其传递给数百个将要搜索并保存到数据库的线程。
连接异常提示我,但是当我通过pgAdmin4检查连接时
我通过缓存java代码中的数据来解决这个问题,以避免频繁搜索和保存,但上面的问题仍然存在。
任何帮助将不胜感激 ;)
使用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设置来配置空闲时保持连接的时间。
在@ g00glen00b的帮助下,我检查了Spring Boot依赖项,发现maxIdle & minEvictableIdleTimeMillis
实际上是由Spring Boot使用的。
tomcat使用maxActive: 100
属性来控制允许多少空闲连接以及在被驱逐之前它们可以保留多长时间。它的默认值是spring.datasource.tomcat.max-idle=50
,它直接解释了一切。
在Spring Boot中,您可以将此属性作为qazxswpoi进行管理。
但正如@ g00glen00b所提到的,也许直接管理这个可能会损害性能的值并不好。基于系统本身的清晰意图应该非常谨慎地使用它。
在我的情况下,我没有触摸它们,我重构了我的java代码来缓存数据以减少java端的连接。