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 + Hibernate 中的第二个数据源