[英]How to set MongoDB ReadPreference in Spring MVC's contextConfigLocation
我通過Spring MVC中的mongodb java驅動程序連接到MongoDB分片服務器。 我使用以下版本:
我的Mongo選項在contextConfigLocation文件mvc-dispatcher-servlet.xml中設置
<mongo:mongo host="mongo.sample.com" port="30000">
<mongo:options auto-connect-retry="true"
slave-ok="true"/>
</mongo:mongo>
它的工作原理非常好,但是slave-ok已被come.MongoDB.ReadPreference棄用了。 我只是想知道是否有任何方法可以在contextConfiLocation文件中為Spring MVC設置readPreference。
聲明以下bean
<bean id="readPreferenceSecondary" class="com.mongodb.TaggableReadPreference.SecondaryReadPreference">
</bean>
和
你在你的mongotemplate注入這個
<bean id="mongoTemplateProdDb" class="org.springframework.data.mongodb.core.MongoTemplate" >
<property name="readPreference" ref="readPreferenceSecondary"></property>
</bean>
通過將ReadPreference
設置為SECONDARY
,將ReadPreference
的回答擴展到答案:“以編程方式在MongoTemplate中執行”。
MongoTemplate template = new MongoTemplate(...);
template.setReadPreference(com.mongodb.ReadPreference.SECONDARY);
如果您有多個輔助(副本集),您可以更具體,並使用標記明確告訴mongo驅動程序您要讀取哪個輔助節點 。
在mongo端,您運行此命令:
db.getMongo().setReadPref('secondaryPreferred',
[{"tagName":"TagVal1"},
{"tagName":"TagVal2"},
{}])
在代碼中它看起來像這樣:
MongoTemplate template = new MongoTemplate(...)
template.setReadPreference(ReadPreference.secondaryPreferred("your DBObject that reflect your mongo tag names");
希望能幫助到你。
如果您使用的是spring-data-mongodb並且需要根據查詢查詢使用多個“讀取首選項”,則可以創建多個Mongo模板和/或存儲庫,如
@EnableMongoRepositories(basePackages = {
"com.you.repo.package" }, mongoTemplateRef = "mongoTemplateOne")
@Configuration
public class MongoConfig {
@Bean(name="mongoTemplateOne")
public MongoTemplate getMongoTemplateOne() throws UnknownHostException {
MongoTemplate templateOne = new MongoTemplate(new SimpleMongoDbFactory(new MongoClientURI("YOUR_MONGO_URL")));
templateOne.setReadPreference(ReadPreference.secondaryPreferred());
//setting WriteConcern but not relevant for this thread
templateOne.setWriteConcernResolver(yourWriteConcernResolver());
return templateOne;
}
@Bean(name = "mongoTemplateTwo")
public MongoTemplate getMongoTemplateTwo() throws UnknownHostException {
MongoTemplate templateTwo = new MongoTemplate(new SimpleMongoDbFactory(new MongoClientURI("YOUR_MONGO_URL")));
templateTwo.setReadPreference(ReadPreference.secondaryPreferred());
return templateTwo;
}
private WriteConcernResolver yourWriteConcernResolver() {
return action -> {
if (action.getCollectionName()
.equals("your_collecton")
&& (action.getMongoActionOperation() == MongoActionOperation.SAVE
|| action.getMongoActionOperation() == MongoActionOperation.UPDATE)) {
return WriteConcern.MAJORITY;
}
return action.getDefaultWriteConcern();
};
}
如果需要根據集合在主DBCollection
和輔助ReadPreference
之間進行混合,則可以在DBCollection
對象上設置DBCollection
。 這有助於避免復雜的多個MongoTemplate
配置。 而是在應用程序生命周期中設置一次集合級別首選項,如下所示 該特定集合的所有讀取將轉到輔助集合,而對於其他集合,它將轉到主要集合。
DBCollection dbCollection = mongoTemplate.getCollection(mongoTemplate.getCollectionName(collection));
dbCollection.setReadPreference(ReadPreference.secondaryPreferred());
如果您想了解實現它的不同選項,請查看Spring數據mongodb二次讀取
從spring-mongo-2.0.xsd開始 , slave-ok
已被完全刪除,但已為ReadPreference
XML配置添加了支持。 這是為當前XSD翻譯的原始問題中的XML:
<mongo:mongo-client host="mongo.sample.com" port="30000">
<mongo:client-options read-preference="SECONDARY_PREFERRED" />
</mongo:mongo-client>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.