美好的一天!
我有一个带有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)
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属性
您配置了以下属性:
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财产没有得到适当的接受。
ConnectionPool
org.apache.tomcat
max- total
如果要为Tomcat连接池配置此maxActive属性,则需要使用以下属性:
maxActive
spring.datasource.tomcat.max-active=1
另外,如果您不想使用Tomcat连接池,则可以使用Maven / Gradle / …添加DBCP 2依赖项。如果排除默认的Tomcat连接池,它将自动选择DBCP 2。
另一种可能性是通过使用文档中spring.datasource.type提到的属性来配置它:
spring.datasource.type
您可以完全绕过该算法,并通过spring.datasource.type属性指定要使用的连接池。如果您在Tomcat容器中运行应用程序,则这一点尤其重要,因为默认情况下提供了tomcat- jdbc。
例如:
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource