Java 弹簧靴座+;ClearDB mySQL“;超过';最大用户连接数'&引用;错误

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

我每隔一段时间就会随机出现这个错误:“java.sql.SQLSyntaxErrorException:用户{key}已经超过了“max_User_connections”资源(当前值: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
    
    编辑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<>();
    }