Конфигурация базы данных Master-Slave с пулом Hikari - PullRequest
1 голос
/ 16 октября 2019

У меня есть два компонента DataSource Bean, один с аннотацией @Primary. Отдельные пулы Hikari создаются для каждого источника данных.

Я пытаюсь изменить источник HikariDataSource с пула 1 (если соединение недоступно) на пул 2.

@Primary
@Bean(destroyMethod = "close", name = "dataSource")
public CustomHikariDataSource dataSource() throws SQLException {
    try {
        primaryDataSource = mainDataSource();
    } catch (Exception e) {
        primaryDataSource = secondaryDataSource();
    }
    HikariConfig config = new HikariConfig();
    config.setDataSource(primaryDataSource);
    config.setPoolName("POOL_PRIMARY");
    config.setAllowPoolSuspension(true);
    config.setIdleTimeout(10000);
    config.setMaxLifetime(30000);
    return new CustomHikariDataSource(config);
}

@Bean(destroyMethod = "close", name = "failoverDataSource")
public CustomHikariDataSource failoverDataSource() throws SQLException {
    secondaryDataSource = secondaryDataSource();
    HikariConfig config = new HikariConfig();
    config.setDataSource(secondaryDataSource);
    config.setPoolName("POOL_SECONDARY");
    config.setAllowPoolSuspension(true);
    return new CustomHikariDataSource(config);
}

private DataSource mainDataSource() {
    return dataSourceProperties().initializeDataSourceBuilder().build();

}

private DataSource secondaryDataSource() {
    return failoverDataSourceProperties().initializeDataSourceBuilder().build();

}

Где находится настоящая проблема

1 Ответ

0 голосов
/ 18 октября 2019

Наконец-то я смог достичь этого, переопределив метод getConnection () из HikariDataSource.class

@Override
public Connection getConnection() throws SQLException {

    if (isClosed()) {
        throw new SQLException("HikariDataSource " + this + " has been closed.");
    }

    if (fastPathPool != null && (fastPathPool.poolState == 0 || fastPathPool.poolState == 1)) {
        try {
            fastPathPool.resumePool();
            con = fastPathPool.getConnection();
        } catch (Exception e) {

        }
        if (con.isClosed()) {
            config = pool.config;
            fastPathPool.suspendPool();
        } else
            return con;
    }

    config.setDataSource(dataSource);
    config.setAllowPoolSuspension(true);
    config.setMinimumIdle(minIdle);
    pool = new HikariPool(config);
    HikariPool result = pool;
    if (result == null) {
        synchronized (this) {
            result = pool;
            if (result == null) {
                validate();
                System.out.println("{} - Starting..." + getPoolName());
                try {
                    pool = result = new HikariPool(this);
                    this.seal();
                } catch (PoolInitializationException pie) {
                    if (pie.getCause() instanceof SQLException) {
                        throw (SQLException) pie.getCause();
                    } else {
                        throw pie;
                    }
                }
                System.out.println("{} - Start completed." + getPoolName());
            }
        }
    }

    return result.getConnection();

}

Для полного класса, не стесняйтесь пинговать меня.

Счастливого кодирования! :)

...