Spring Boot 中的动态数据库属性更改

Posted

技术标签:

【中文标题】Spring Boot 中的动态数据库属性更改【英文标题】:Dynamic Database property changes in Springboot 【发布时间】:2018-02-12 10:33:23 【问题描述】:

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

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

【问题讨论】:

尝试使用@refreshscope。可以工作。 cloud.spring.io/spring-cloud-static/docs/1.0.x/… 【参考方案1】:

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

    Spring 配置服务器非常适合简单的键值对。

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

    mongodb.feed.database=kiran
    mongodb.feed.host=localhost
    mongodb.feed.port=27017
    

您正在像这样在应用程序中配置 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 端点刷新范围。它工作得很好。

    使用 springboot 你不需要像这样手动配置。 Spring boot 对大多数东西都有自动配置。继续上面的相同示例,如果您要放入类似这样的配置属性

    spring.data.mongodb.uri=mongodb://localhost:27017/phani
    

spring-boot 将为您配置 MongoTemplate(您不需要像第二点那样创建自己)。 打嗝来了。 现在,如果您更改数据库名称并刷新范围,它就不起作用了。因为在这种情况下,MongoTemplate 是通过 spring-boot Autoconfiguration(MongoAutoConfiguration) 配置的

因此,总而言之,在将其用于生产之前(尤其是对于复杂的 bean,如数据源、MongoTemplates),它需要进行广泛的测试,因为没有足够的文档。但我想说,值得一试.

【讨论】:

以上是关于Spring Boot 中的动态数据库属性更改的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中 html 文件的动态更改

Spring Boot 2:动态刷新属性不起作用

在运行时更改 Java Spring Boot Bean

动态数据源作为 Spring Boot + Hibernate 中的第二个数据源

从数据库中动态检索 Spring Boot CORS 配置以获取控制器中的特定方法

在 Spring boot 中动态配置 DataSourceBuilder url