Java 如何在Spring MVC中设置MongoDB ReadPreference';s上下文配置位置

Java 如何在Spring MVC中设置MongoDB ReadPreference';s上下文配置位置,java,mongodb,spring-mvc,sharding,Java,Mongodb,Spring Mvc,Sharding,我正在通过SpringMVC中的MongoDBJava驱动程序连接到MongoDB分片服务器。我正在使用以下版本: spring-webmvc-3.2.1.0版本 mongo java驱动程序/2.10.0/mongo-java-driver-2.10.0 spring-data-mongodb-1.2.0.RELEASE 我的Mongo选项在contextConfigLocation文件mvc-dispatcher-servlet.xml中设置 <mongo:mongo host="

我正在通过SpringMVC中的MongoDBJava驱动程序连接到MongoDB分片服务器。我正在使用以下版本:

  • spring-webmvc-3.2.1.0版本
  • mongo java驱动程序/2.10.0/mongo-java-driver-2.10.0
  • spring-data-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>


它工作得很好,但是come.MongoDB.ReadPreference不推荐使用slave ok。我只是想知道是否有任何方法可以在ContextConfication文件中设置Spring MVC的readPreference。

将@Trisha的响应扩展为一个答案:“以编程方式在MongoTemplate中执行”,方法是将

MongoTemplate template = new MongoTemplate(...);
template.setReadPreference(com.mongodb.ReadPreference.SECONDARY);

声明以下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>

如果您有多个辅助设备(副本集),您可以更具体地告诉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,并且需要基于find query使用多个读取首选项,您可以创建多个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
。这有助于避免复杂的多
MongoTemplate
配置。相反,在应用程序生命周期中设置一次集合级别首选项,如下所示。该特定集合的所有读取将转到辅助集合,而其他集合的所有读取将转到主集合

DBCollection dbCollection = mongoTemplate.getCollection(mongoTemplate.getCollectionName(collection));
dbCollection.setReadPreference(ReadPreference.secondaryPreferred());
如果您想知道实现此功能的不同选项,请检查从的
从属ok
已完全删除,但已添加对
ReadPreference的XML配置的支持。以下是为当前XSD翻译的原始问题中的XML:

<mongo:mongo-client host="mongo.sample.com" port="30000">
     <mongo:client-options read-preference="SECONDARY_PREFERRED" />
</mongo:mongo-client>


您可以通过
mongoTemplate
进行设置。为了确保查看模式(),您只能设置从属模式ok,没有“次要首选”选项(即替换选项)。您可以使用slave OK,尽管有人反对,Mongo驱动程序仍然支持slave OK。但是,通过将读取首选项设置为secondary,您可以在MongoTemplate上完成此操作。@Trisha,您是对的,仅支持Slave ok。在MongoTemplate中以编程方式将其设置为辅助也可以,但如果每次我想从MongoTemplate获取集合时调用setReadPreference(),是否会产生太大的开销?不,您只需在集合(或数据库)上设置一次,然后它将用作该集合(或数据库&因此是所有集合)的默认值从那时起,,