Java 动态刷新数据库配置

Java 动态刷新数据库配置,java,database,spring,properties,dns,Java,Database,Spring,Properties,Dns,我在属性文件中有数据库配置: port=8080 host=host-default 主机默认值显然是DNS。下面是我的配置类: @Configuration @Slf4j public class DatabaseConfig { @Value("${port}") private int port; @Value("${host}") private String hostname; @Bean public DatabaseTemplate databaseTemplate() {

我在属性文件中有数据库配置:

port=8080
host=host-default
主机默认值显然是DNS。下面是我的配置类:

@Configuration
@Slf4j
public class DatabaseConfig {

@Value("${port}")
private int port;
@Value("${host}")
private String hostname;

@Bean
public DatabaseTemplate databaseTemplate() {
    try {
        return new DatabaseTemplate(client());
    } catch (Exception e) {
        log.error("Ex: " + e.getMessage(), e);
        return null;
    }
}

@Bean
public Client client() throws UnknownHostException {
    TransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(this.hostname), this.port);
    client.addTransportAddress(address);
    return client;
}
}

所以,有一个问题。当服务器运行时,同时我更改了DNS,与DB的连接将断开。此时我无法刷新配置。我可以捕捉到DNS更改的时刻,但我无法更新配置。你知道吗?我试图销毁DatabaseTemplateSingleton,但没有任何帮助。谢谢

您需要创建一个包装数据库连接的新bean,然后根据计划进行更新:

@Component
public class DataSourceManager implements DataSource{

    private DataSource dataSource;

    @PostConstruct
    @Scheduled(fixedRate=1000)
    public void reload() {
        // init the datasource
    }

    public DataSource getDataSource(String dbName) {
        return dataSource;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    .... wrap all the other DataSource methods

}

您需要创建一个包装数据库连接的新bean,然后根据计划进行更新:

@Component
public class DataSourceManager implements DataSource{

    private DataSource dataSource;

    @PostConstruct
    @Scheduled(fixedRate=1000)
    public void reload() {
        // init the datasource
    }

    public DataSource getDataSource(String dbName) {
        return dataSource;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    .... wrap all the other DataSource methods

}

为什么建议按计划重新初始化?它应该按需触发,即当DNS出现故障时。@Matt是的,这是一个很好的观点,当DNS出现故障时,只需调用reload,然后放弃计划。您为什么建议按计划重新初始化?它应该按需触发,即当DNS出现故障时。@Matt是的,好的,只要在DNS出现故障时调用reload,并放弃计划的