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

Posted

技术标签:

【中文标题】SpringBoot MySQL JDBC无法创建池的初始连接【英文标题】:SpringBoot MySQL JDBC Unable to create initial connections of pool 【发布时间】:2018-08-08 00:22:01 【问题描述】:

美好的一天!

我有一个带有 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] o.a.tomcat.jdbc.pool.ConnectionPool:无法创建初始 池的连接数。

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

我该如何解决?如果我在 DB 上有 5 个免费连接并且我只需要 1 个来自属性的池连接,为什么我会得到那个异常?我无法在 DB 上编辑最大连接,因为使用了像 testDB 这样的 Heroku。我只能编辑 tomcat 属性

【问题讨论】:

How to solve MySQL max_user_connections error的可能重复 【参考方案1】:

您配置了以下属性:

spring.datasource.dbcp2.max-total=1

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

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 属性来配置它,正如the documentation 提到的:

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

例如:

spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource

【讨论】:

太好了!是回答!谢谢!【参考方案2】:

我陷入了类似的情况,但解决此问题的简单方法可能是您在 application.properties 中指向的数据库可能不存在。

或者您可以尝试从C:\Users\yourusername\.m2 文件夹中删除 org.springframework.data 文件夹并更新 Maven 项目。

【讨论】:

【参考方案3】:

我得到了完全相同的错误,在将 spring boot 版本从 1.5.* 更改为 2.1.8 后它对我有用。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

【讨论】:

【参考方案4】:

这里有同样的问题...尝试像 SaravanaKumar 所说的那样更改父级的版本,但该项目太旧了,我被很多人弃用了。

我通过仅更改数据库版本来修复

  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.23</version> <!--Add that Line-->
      <scope>runtime</scope>
  </dependency>

注意:如果更新父所有依赖项,则更新。

【讨论】:

以上是关于SpringBoot MySQL JDBC无法创建池的初始连接的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot JDBC无法连接到docker容器中的mysql

启动 SpringBoot 应用程序时使用 JDBC 驱动程序创建 Postgres 数据库?

Spring boot无法从数据源(mysql)确定jdbc url

无法加载 JDBC 驱动程序类 [com.mysql.cj.jdbc.Driver]

springboot项目部署到Linux虚拟机,jdbc无法使用IP访问本地物理机数据库

如何解决“无法为连接 URL 创建类 'com.mysql.jdbc.Driver' 的 JDBC 驱动程序”