一尘不染

SpringBoot MySQL JDBC无法创建池的初始连接

tomcat

美好的一天!

我有一个带有mysql jdbc存储库的简单springboot应用程序。

我有用于连接到数据库的属性

spring.datasource.url=jdbc:mysql://*:3306/*?useSSL=false
spring.datasource.username=*
spring.datasource.password=*
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialize=true
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.max-total=1

我的测试数据库最多只有10个用户连接。当我使用控制台

SHOW STATUS WHERE variable_name = 'threads_connected';

我可以看到现在DB仅具有5个连接,但是当我尝试启动应用程序时出现异常

2018-02-28 10:26:24.115错误17360 — [nio-8080-exec-3]
oatomcat.jdbc.pool.ConnectionPool:无法创建池的初始连接。

java.sql.SQLSyntaxErrorException:用户’*’已超出’max_user_connections’资源(当前值:10)

我该如何解决?如果我在DB上有5个免费连接并且从属性池中仅需要1个连接,为什么还要得到该异常?我无法在数据库上编辑最大连接,因为像testDB一样使用Heroku。我只能编辑tomcat属性


阅读 494

收藏
2020-06-16

共1个答案

一尘不染

您配置了以下属性:

spring.datasource.dbcp2.max-total=1

这表明您正在尝试使用DBCP 2连接池。但是,当您检查stacktrace时,可以看到以下内容:

o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool.

由于ConnectionPool该类的软件包是org.apache.tomcat,这表明您实际上正在使用默认的Tomcat连接池。这意味着您的max- total财产没有得到适当的接受。

如果要为Tomcat连接池配置此maxActive属性,则需要使用以下属性:

spring.datasource.tomcat.max-active=1

另外,如果您不想使用Tomcat连接池,则可以使用Maven / Gradle / …添加DBCP
2依赖项。如果排除默认的Tomcat连接池,它将自动选择DBCP 2。

另一种可能性是通过使用文档中spring.datasource.type提到的属性来配置它:

您可以完全绕过该算法,并通过spring.datasource.type属性指定要使用的连接池。如果您在Tomcat容器中运行应用程序,则这一点尤其重要,因为默认情况下提供了tomcat-
jdbc。

例如:

spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
2020-06-16