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

时间:2013-10-24 02:45:09

标签: java mongodb spring-mvc sharding

我通过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>

它工作得很好,但是来自于ok的db.MongoDB.ReadPreference弃用了。我只是想知道是否有任何方法可以在contextConfiLocation文件中为Spring MVC设置readPreference。

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

通过将ReadPreference设置为SECONDARY,将@Trisha的回答扩展到答案:“以编程方式在MongoTemplate中执行此操作”。

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

答案 2 :(得分:1)

如果您有多个辅助(副本集),您可以更具体,并使用tags明确告诉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");

希望它有所帮助。

答案 3 :(得分:1)

如果您正在使用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();
        };
    }

答案 4 :(得分:0)

如果根据集合需要在主要和次要读取之间混合使用,则可以在ReadPreference对象上设置DBCollection。这有助于避免复杂的多个MongoTemplate配置。相反,在应用程序生存期内,一次如下设置收集级别首选项。该特定馆藏的所有读物将进入二级读物,而其他馆藏的所有读物将进入主读物。

DBCollection dbCollection = mongoTemplate.getCollection(mongoTemplate.getCollectionName(collection));
dbCollection.setReadPreference(ReadPreference.secondaryPreferred());

如果您想了解实现此目标的其他方法,请选中Spring data mongodb secondary reads

答案 5 :(得分:0)

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>