知乎专栏 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class }
package cn.netkiller; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.context.ApplicationPidFileWriter; @SpringBootApplication(exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class }) public class Application { public static void main(String[] args) { System.out.println("Starting..."); SpringApplication springApplication = new SpringApplication(Application.class); springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.run(args); } }
mongodb.primary.uri=mongodb://netkiller:chen@192.168.30.10:27017/news mongodb.secondary.uri=mongodb://netkiller:chen@192.168.30.5:27017/member
package cn.netkiller.config; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; import com.mongodb.ConnectionString; public abstract class AbstractMongoConfigure { public MongoDatabaseFactory mongoDatabaseFactory(String uri) { ConnectionString connectionString = new ConnectionString(uri); return new SimpleMongoClientDatabaseFactory(connectionString); } }
配置多数据源
package cn.netkiller.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @Configuration @ConfigurationProperties(prefix = "mongodb") @EnableMongoRepositories(basePackages = { "cn.netkiller.repository" }, mongoTemplateRef = MultipleMongoConfigure.primaryMongoTemplate) public class MultipleMongoConfigure extends AbstractMongoConfigure { protected static final String primaryMongoTemplate = "primaryMongoTemplate"; protected static final String secondaryMongoTemplate = "secondaryMongoTemplate"; private MongoProperties primary = new MongoProperties(); private MongoProperties secondary = new MongoProperties(); public MongoProperties getPrimary() { return primary; } public void setPrimary(MongoProperties primary) { this.primary = primary; } public MongoProperties getSecondary() { return secondary; } public void setSecondary(MongoProperties secondary) { this.secondary = secondary; } public MultipleMongoConfigure() { } @Primary @Bean(name = MultipleMongoConfigure.primaryMongoTemplate) @Qualifier(value = MultipleMongoConfigure.primaryMongoTemplate) public MongoTemplate primaryMongoTemplate() throws Exception { String uri = this.getPrimary().getUri(); return new MongoTemplate(mongoDatabaseFactory(uri)); } @Bean(name = "secondaryMongoTemplate") @Qualifier("secondaryMongoTemplate") public MongoTemplate secondaryMongoTemplate() throws Exception { String uri = this.getSecondary().getUri(); return new MongoTemplate(mongoDatabaseFactory(uri)); } }
package cn.netkiller.domain; import java.io.Serializable; import java.util.Date; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoId; import com.fasterxml.jackson.annotation.JsonFormat; @Document public class User implements Serializable { private static final long serialVersionUID = -3258839839160856613L; // private Long id; @MongoId private String id; private String useruame; private String password; private String name; private String sex; private Integer age; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date birthday; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUseruame() { return useruame; } public void setUseruame(String useruame) { this.useruame = useruame; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
package cn.netkiller.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import cn.netkiller.domain.User; import cn.netkiller.service.UserService; @RestController public class TestMongoController { @Autowired @Qualifier(value = "primaryMongoTemplate") private MongoTemplate primaryMongoTemplate; @Autowired @Qualifier(value = "secondaryMongoTemplate") private MongoTemplate secondaryMongoTemplate; public TestMongoController() { // TODO Auto-generated constructor stub } @GetMapping("/mongo/primary/save") public String primarysave() { User user = new User(); user.setUseruame("netkiller"); user.setPassword("123456"); primaryMongoTemplate.save(user); return "Success\r\n"; } @GetMapping("/mongo/secondary/save") public String secondaryMongoTemplate() { User user = new User(); user.setUseruame("netkiller"); user.setPassword("123456"); secondaryMongoTemplate.save(user); return "Success\r\n"; } }
启动 Springboot 可以看到下面👇日志,两个MongoDB都链接成功。
2021-10-14 19:29:50.037 INFO 93698 --- [ main] org.mongodb.driver.cluster : Cluster created with settings {hosts=[192.168.30.10:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'} 2021-10-14 19:29:50.156 INFO 93698 --- [168.30.10:27017] org.mongodb.driver.connection : Opened connection [connectionId{localValue:1, serverValue:126}] to 192.168.30.10:27017 2021-10-14 19:29:50.157 INFO 93698 --- [168.30.10:27017] org.mongodb.driver.cluster : Monitor thread successfully connected to server with description ServerDescription{address=192.168.30.10:27017, type=STANDALONE, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=13, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=31466638} 2021-10-14 19:29:50.157 INFO 93698 --- [168.30.10:27017] org.mongodb.driver.connection : Opened connection [connectionId{localValue:2, serverValue:127}] to 192.168.30.10:27017 2021-10-14 19:29:50.266 INFO 93698 --- [ main] org.mongodb.driver.cluster : Cluster created with settings {hosts=[192.168.30.5:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'} 2021-10-14 19:29:50.272 INFO 93698 --- [.168.30.5:27017] org.mongodb.driver.connection : Opened connection [connectionId{localValue:3, serverValue:969}] to 192.168.30.5:27017 2021-10-14 19:29:50.272 INFO 93698 --- [.168.30.5:27017] org.mongodb.driver.connection : Opened connection [connectionId{localValue:4, serverValue:968}] to 192.168.30.5:27017 2021-10-14 19:29:50.272 INFO 93698 --- [.168.30.5:27017] org.mongodb.driver.cluster : Monitor thread successfully connected to server with description ServerDescription{address=192.168.30.5:27017, type=STANDALONE, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=13, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=2345376}
neo@MacBook-Pro-Neo ~ % curl http://localhost:8080/mongo/primary/save Success neo@MacBook-Pro-Neo ~ % curl http://localhost:8080/mongo/secondary/save Success
现在去两个 MongoDB 数据查看输入是否保存成功。
在使用 curl 调用的时候,日志会显示链接两个 MongoDB 的状态。
2021-10-14 19:34:27.795 INFO 93698 --- [ XNIO-1 task-1] org.mongodb.driver.connection : Opened connection [connectionId{localValue:5, serverValue:970}] to 192.168.30.5:27017 2021-10-14 19:34:31.096 INFO 93698 --- [ XNIO-1 task-1] org.mongodb.driver.connection : Opened connection [connectionId{localValue:6, serverValue:130}] to 192.168.30.10:27017