MongoDB 多數(shù)據(jù)源連接池配置
1.Config配置類
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
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.MongoDatabaseFactory;
import org.springframework.data.mongodb.SpringDataMongoDB;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import java.util.concurrent.TimeUnit;
/**
* @author: curyu
* @date: 2022/9/5 13:51
* @description: mongodb連接池配置
*/
@Configuration
public class MongoConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.data.mongodb.primary")
public MongoProperties masterMongoProperties() {
return new MongoProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.data.mongodb.second")
public MongoProperties secondMongoProperties() {
return new MongoProperties();
}
/**
* 連接池自定義配置處理
*
* @return
*/
@Bean
@Primary
public MongoDatabaseFactory mongoDatabaseFactory(@Qualifier("masterMongoProperties") MongoProperties properties) {
MongoClientSettings.Builder builder = MongoClientSettings.builder();
builder.applyConnectionString(new ConnectionString(properties.getUri()));
builder.applyToConnectionPoolSettings(b -> {
// 允許的最大連接數(shù)。這些連接在空閑時將保留在池中锋拖。一旦池耗盡咙咽,任何需要連接的操作都將阻塞等待可用連接 默認: 100
b.maxSize(100);
// 最小連接數(shù)菲宴。這些連接在空閑時將保留在池中坯辩,并且池將確保它至少包含這個最小數(shù)量 默認: 0
b.minSize(5);
// 池連接可以存活的最長時間箕昭。零值表示壽命沒有限制毒姨。超過其生命周期的池連接將被關(guān)閉并在必要時由新連接替換
b.maxConnectionLifeTime(0, TimeUnit.SECONDS);
// 池連接的最大空閑時間宿礁。零值表示對空閑時間沒有限制。超過其空閑時間的池連接將被關(guān)閉并在必要時由新連接替換
b.maxConnectionIdleTime(5, TimeUnit.MINUTES);
// 默認最大連接時間120s;
b.maxWaitTime(60000, TimeUnit.MILLISECONDS);
});
MongoClient mongoClient = MongoClients.create(builder.build(), SpringDataMongoDB.driverInformation());
return new SimpleMongoClientDatabaseFactory(mongoClient, properties.getDatabase());
}
/**
* 連接池自定義配置處理
*
* @return
*/
@Bean
public MongoDatabaseFactory secondMongoDatabaseFactory(@Qualifier("secondMongoProperties") MongoProperties properties) {
MongoClientSettings.Builder builder = MongoClientSettings.builder();
builder.applyConnectionString(new ConnectionString(properties.getUri()));
builder.applyToConnectionPoolSettings(b -> {
// 允許的最大連接數(shù)茬射。這些連接在空閑時將保留在池中鹦蠕。一旦池耗盡,任何需要連接的操作都將阻塞等待可用連接 默認: 100
b.maxSize(100);
// 最小連接數(shù)在抛。這些連接在空閑時將保留在池中钟病,并且池將確保它至少包含這個最小數(shù)量 默認: 0
b.minSize(5);
// 池連接可以存活的最長時間。零值表示壽命沒有限制刚梭。超過其生命周期的池連接將被關(guān)閉并在必要時由新連接替換
b.maxConnectionLifeTime(0, TimeUnit.SECONDS);
// 池連接的最大空閑時間肠阱。零值表示對空閑時間沒有限制。超過其空閑時間的池連接將被關(guān)閉并在必要時由新連接替換
b.maxConnectionIdleTime(5, TimeUnit.MINUTES);
// 默認最大連接時間120s;
b.maxWaitTime(60000, TimeUnit.MILLISECONDS);
});
MongoClient mongoClient = MongoClients.create(builder.build(), SpringDataMongoDB.driverInformation());
return new SimpleMongoClientDatabaseFactory(mongoClient, properties.getDatabase());
}
@Bean
@Primary
public MongoTemplate mongoTemplate(@Qualifier("mongoDatabaseFactory") MongoDatabaseFactory mongoDatabaseFactory) {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory);
//去除保存實體時朴读,spring data mongodb 自動添加的_class字段
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setTypeMapper(new DefaultMongoTypeMapper(null));
mongoMapping.afterPropertiesSet();
return mongoTemplate;
}
@Bean
public MongoTemplate secondMongoTemplate(@Qualifier("secondMongoDatabaseFactory") MongoDatabaseFactory mongoDatabaseFactory) {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory);
//去除保存實體時屹徘,spring data mongodb 自動添加的_class字段
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setTypeMapper(new DefaultMongoTypeMapper(null));
mongoMapping.afterPropertiesSet();
return mongoTemplate;
}
}
2. 配置文件
spring:
data:
mongodb:
# mongodb 默認數(shù)據(jù)源
primary:
uri: mongodb://root:root@10.15.1.155:27017/${spring.data.mongodb.primary.database}?authSource=admin&authMechanism=SCRAM-SHA-1
database: test-db
# mongodb 第二數(shù)據(jù)源
second:
uri: mongodb://admin:admin123@10.15.1.156:27017/${spring.data.mongodb.second.database}?authSource=admin&authMechanism=SCRAM-SHA-1
database: test2-db
3. 數(shù)據(jù)源測試
import com.mongodb.client.FindIterable;
import lombok.Data;
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author: curyu
* @date: 2021/9/4 16:56
* @description:
*/
@Data
@RunWith(SpringRunner.class)
@SpringBootTest
class MongoUtilTest {
@Autowired
private MongoTemplate mongoTemplate;
@Qualifier("secondMongoTemplate")
@Autowired
private MongoTemplate secondMongoTemplate;
@Test
void getById() {
System.out.println(" mongo DataSource 1 ...");
// 數(shù)據(jù)源1
FindIterable<Document> cc = mongoTemplate.getCollection("order").find().limit(10);
for (Document document : cc) {
System.out.println(document);
}
System.out.println(" mongo DataSource 2 ...");
// 數(shù)據(jù)源2
FindIterable<Document> cc2 = secondMongoTemplate.getCollection("order2").find().limit(10);
for (Document document : cc2) {
System.out.println(document);
}
}
}