簡體   English   中英

如何在Spring MVC的contextConfigLocation中設置MongoDB ReadPreference

[英]How to set MongoDB ReadPreference in Spring MVC's contextConfigLocation

我通過Spring MVC中的mongodb java驅動程序連接到MongoDB分片服務器。 我使用以下版本:

  • 彈簧webmvc-3.2.1.RELEASE
  • 蒙戈-Java的應用程序/ 2.10.0 /蒙戈-java的驅動程序2.10.0
  • 彈簧數據的mongodb-1.2.0.RELEASE

我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM