【发布时间】:2020-04-30 11:49:07
【问题描述】:
我每隔一段时间就会随机收到此错误:“java.sql.SQLSyntaxErrorException: User '{key}' has exceeded the 'max_user_connections' resource (current value: 10)”。
我已经尝试在谷歌上搜索帮助,但我只能找到:
- “增加最大连接数限制”(在免费的 clearDB 中无法做到)
- “调整 maxActive 数量”或“释放旧连接”(我在 Spring Boot 中都找不到如何操作)
我的代码如下所示:
// application.properties
# Connect to heroku ClearDB MySql database
spring.datasource.url=jdbc:mysql://{heroku_url}?reconnect=true
spring.datasource.username={user}
spring.datasource.password={password}
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto=update
#MySQL DIALECT
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.open-in-view=false
server.port=8080
@Configuration
public class DatabaseConfig {
@Value("${spring.datasource.url}")
private String dbUrl;
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
return new HikariDataSource(config);
}
}
编辑 1:我尽我所能遵循 PauMAVA 的说明,我想出了这段代码,但由于某种原因失败了:
@Configuration
public class DatabaseConfig {
@Value("${spring.datasource.url}")
private String dbUrl;
public static DataSource ds;
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
DataSource ds = new HikariDataSource(config);
DatabaseConfig.ds = ds;
return ds;
}
}
// Main class
public static void main(String[] args) {
SpringApplication.run(BloggerApplication.class, args);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
DataSource ds = DatabaseConfig.ds;
if (ds != null) {
try {
ds.getConnection().close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}, "Shutdown-thread"));
}
【问题讨论】:
-
尝试使用
HikariConfig中的setMaximumPoolSize(5)降低最大池大小。 Hikari 的默认最大池大小为 10,这也是 ClearDB 的最大限制。还要避免长时间运行的查询。 -
@RyanGuamos 似乎有效,我现在已经重新启动后端超过 10 次并且每次都获取数据并且完全没有错误。我只是希望有某种方法可以测试它现在是否确实已修复,在我对 HikariConfig 进行每次更改后,它始终可以正常工作一段时间。
-
您也可以考虑增加
HikariConfig的连接超时时间,默认为 30 秒,因此如果连接已经达到最大池大小,查询可能会等待超过 30 秒 -
@RyanGuamos 如果我增加连接超时有一个问题,我一直在默认时间收到此警告:
"WARN 7364 - Possibly consider using a shorter maxLifetime value"所以我不得不将其更改为:config.setMaxLifetime(30000);,或者是连接超时与 maxLifetime 不同? -
maxLifetime不同于connectionTimeout你可以参考他们的官方文档https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
标签: java mysql spring-boot spring-data-jpa cleardb