Springboot中的动态数据库属性更改

时间:2018-02-12 10:33:23

标签: java spring spring-boot

我有mysql数据库,我在application.properties文件中配置了数据库属性。 现在,如果我确实更改了数据库连接属性,我希望动态地将这些更改反映到我的应用程序中,意味着无需重新启动服务器

这可能与spring cloud配置服务器和执行器一起使用吗?

1 个答案:

答案 0 :(得分:1)

我已经对此进行了相当多的测试,这是我的发现。

  1. Spring配置服务器适用于简单的键值对。
  2. 它也适用于数据库属性,前提是您自己创建数据源对象并且使用@RefreshScope
    例如,如果您有一个具有这些属性的配置服务器。

    mongodb.feed.database=kiran
    mongodb.feed.host=localhost
    mongodb.feed.port=27017
    
  3. 你正在这样的应用程序中配置MongoTemplate。

    @Configuration
    @ConfigurationProperties(prefix = "mongodb.feed")
    @EnableMongoRepositories(basePackages = "in.phani.springboot.repository", mongoTemplateRef = "feedMongoTemplate")
    @Setter
    class FeedMongoConfig {
    
      private String host;
      private int port;
      private String database;
    
      @Primary
      @Bean(name = "feedMongoTemplate")
      @RefreshScope // this is the key
      public MongoTemplate feedMongoTemplate() throws Exception {
        final Mongo mongoClient = createMongoClient(new ServerAddress(host, port));
        return new MongoTemplate(mongoClient, database);
      }
    
      Mongo createMongoClient(ServerAddress serverAddress) {
        return new MongoClient(serverAddress);
      }
    }
    

    如果您更改配置属性中的数据库名称,然后使用/refresh端点刷新范围。它工作得很好。

    1. 使用springboot,您无需像这样进行手动配置。 Spring Boot具有自动配置功能。继续上面的相同示例,如果你要输入类似这样的配置属性

      spring.data.mongodb.uri=mongodb://localhost:27017/phani
      
    2. spring-boot将为您配置MongoTemplate(您不需要像第二点那样创建自己)。 这是打嗝 现在,如果更改数据库名称并刷新范围,则它不起作用。因为在这种情况下,MongoTemplate是由spring-boot自动配置(MongoAutoConfiguration)配置的

      总而言之,在将它用于生产之前需要进行大量的测试(特别是对于像数据源,MongoTemplates这样的复杂bean),因为没有足够的文档来讨论这个...但我想说,值得尝试