Java 弹簧靴座+;ClearDB mySQL“;超过';最大用户连接数'&引用;错误
我每隔一段时间就会随机出现这个错误:“java.sql.SQLSyntaxErrorException:用户{key}已经超过了“max_User_connections”资源(当前值:10)” 我曾尝试在谷歌上搜索帮助,但我能找到的只是:Java 弹簧靴座+;ClearDB mySQL“;超过';最大用户连接数'&引用;错误,java,mysql,spring-boot,spring-data-jpa,cleardb,Java,Mysql,Spring Boot,Spring Data Jpa,Cleardb,我每隔一段时间就会随机出现这个错误:“java.sql.SQLSyntaxErrorException:用户{key}已经超过了“max_User_connections”资源(当前值:10)” 我曾尝试在谷歌上搜索帮助,但我能找到的只是: “增加最大连接限制”(这在免费clearDB中无法实现) “调整maxActive量”或“释放旧连接”(这两个我在Spring Boot中都找不到如何做到) 我的代码是这样的: // application.properties # Connect to h
// 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
编辑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;
}
}
无论何时在代码中创建连接对象,建议在finally块中关闭该对象。这样连接的数量就不会耗尽
希望这有帮助 您应该在应用程序终止时关闭数据源,以便没有未使用的连接保持打开状态
public void close(DataSource ds) {
if(ds != null) {
ds.close();
}
}
但是,只有在程序终止时才这样做
要在以后(关闭时)使用数据源,可以将数据源注册为类中的字段:
private DataSource ds;
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
DataSource ds = new HikariDataSource(config);
this.ds = ds;
return ds;
}
如果要有多个数据源,可以采用基于列表的方法:
private List<DataSource> activeDataSources = new ArrayList<>();
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
DataSource ds = new HikariDataSource(config);
this.activeDataSources.add(ds);
return ds;
}
public void closeAllDataSources() {
for(DataSource ds: this.activeDataSources) {
if(ds != null) {
ds.close();
}
}
this.activeDataSources = new ArrayList<>();
}
private List activeDataSources=new ArrayList();
公共数据源数据源(){
HikariConfig config=新的HikariConfig();
config.setJdbcUrl(dbUrl);
数据源ds=新的HikariDataSource(配置);
this.activeDataSources.add(ds);
返回ds;
}
public void closeAllDataSources(){
for(数据源ds:this.activeDataSources){
如果(ds!=null){
ds.close();
}
}
this.activeDataSources=newArrayList();
}
要在程序关闭时执行函数,请参阅。尝试使用
HikariConfig
中的setMaximumPoolSize(5)
降低最大池大小。Hikari的默认最大池大小为10,这也是ClearDB的最大限制。也要避免长时间运行的查询。@RyanGuamos这似乎奏效了,我现在已经重新启动后端超过10次,每次都提取数据,没有出现任何错误。我只是希望我能有办法测试一下它现在真的修好了,在我对HICALICONFIGIGO进行的每一次更改之后,它一直工作正常。您也可以考虑增加< <代码> HikariConfig < /COD>的连接超时,默认情况下是30秒,因此如果连接已经达到最大池,查询可以等待超过30秒。size@RyanGuamos有一个问题:如果我增加连接超时,我在默认时间保持这个警告:<代码>“警告7364 -可能考虑使用一个较短的最大生存期值”< /代码>,所以我必须将它更改为:<代码> CONFIG.SETMASTLIVE(30000);,或者连接超时与maxLifetime不同?maxLifetime
与connectionTimeout
不同。您可以参考他们的官方文档,但我不知道在哪里打开连接。我没有在任何地方调用“datasource”方法,我只使用普通的RestController方法,例如:@RequestMapping(value=“/blogposts”,method=RequestMethod.GET)public Iterable fetchBlogposts(){return blogDatabase.findAll();}我是否需要在我的项目中包含一个执行器模块,以便在后端终止时调用关闭方法,还是有更好的方法?我如何访问该数据源,以便将其作为参数提供?我已经添加了您需要的信息。希望能有帮助:)我觉得自己很愚蠢,但我似乎不明白你想让我如何实现这一点。我并没有从代码中的任何地方访问数据源(据我所知),但我编辑了我的问题以向您展示我是如何理解您的指令的。我觉得我缺少了一些关键方面。您不需要显式关闭连接,因为在Spring引导中,如果添加Spring数据依赖项,它将自动配置事务管理。通过在类级别或方法级别定义@Transactional
,它会在事务完成后自动关闭连接。@Crossoni仅包含spring boot starter数据jpa。当您使用spring数据中可用的任何存储库接口时,它们的默认实现都有一个@Transactional
注释,因此需要将其添加到应用程序的任何层中,除非您需要覆盖它或在服务层中执行一些事务管理。
private DataSource ds;
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
DataSource ds = new HikariDataSource(config);
this.ds = ds;
return ds;
}
private List<DataSource> activeDataSources = new ArrayList<>();
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
DataSource ds = new HikariDataSource(config);
this.activeDataSources.add(ds);
return ds;
}
public void closeAllDataSources() {
for(DataSource ds: this.activeDataSources) {
if(ds != null) {
ds.close();
}
}
this.activeDataSources = new ArrayList<>();
}