Spring Boot Rest + ClearDB mySQL «превышено значение max_user_connections» - PullRequest
0 голосов
/ 30 апреля 2020

Я периодически получаю эту ошибку случайным образом: "java. sql .SQLSyntaxErrorException: пользователь '{key}' превысил ресурс 'max_user_connections' (текущее значение: 10)".

Я попытался найти справку по поиску, но все, что я могу найти, это:

  1. "увеличить максимальный лимит подключений" (что невозможно сделать в бесплатной clearDB)
  2. «настроить максимальное значение» или «освободить старые подключения» (оба из которых я не могу найти, как это сделать в 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"));
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Вы должны закрыть DataSource по завершении приложения, чтобы неиспользуемые соединения не оставались открытыми.

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<>();
}

Чтобы выполнить функцию при закрытии программы, обратитесь к это .

0 голосов
/ 30 апреля 2020

Всякий раз, когда вы создаете объект соединения в своем коде, желательно закрыть его в блоке finally. Таким образом, количество соединений не исчерпывается.

Надеюсь, это поможет!

...