【问题标题】:Refresh database configuration on the fly即时刷新数据库配置
【发布时间】:2017-06-23 08:04:41
【问题描述】:

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

port=8080
host=host-default

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 更改的时刻,但我无法更新配置。你有什么想法吗?我试图破坏 DatabaseTemplate 单例,但它没有帮助。谢谢

【问题讨论】:

    标签: java database spring properties dns


    【解决方案1】:

    您需要创建一个包装数据库连接的新 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 并放弃预定
    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多