1

我想知道如何更改我的 java 代码以支持使用 spring-data 和 MongoDB 的 replset。

我有 3 台 MongoDB 服务器正在运行.. 示例:

./mongod --dbpath=/home/jsmith/tmp/db1 --replSet=spring --port=27017
./mongod --dbpath=/home/jsmith/tmp/db2 --replSet=spring --port=27027
./mongod --dbpath=/home/jsmith/tmp/db3 --replSet=spring --port=27037

如果我执行 rs.status() 我可以看到如果 27017 上的 db 出现故障,那么其他数据库之一将成为主要数据库,因此我知道 mongoDB 工作正常,但在我的 java 代码中,如果我尝试运行它,我会收到以下错误:

Exception in thread "main" org.springframework.dao.DataAccessResourceFailureException: can't call something : /127.0.0.1:27017/demo

它只在端口 27017 上查看

这是我的mongodbconfig:

@Configuration
@EnableMongoRepositories
@ComponentScan(basePackageClasses = {MongoDBApp.class})
@PropertySource("classpath:application.properties")
public class MongoConfiguration extends AbstractMongoConfiguration {


    @Override
    protected String getDatabaseName() {
        return "demo";
    }



    @Override
    public Mongo mongo() throws Exception {
                return new Mongo(new ArrayList<ServerAddress>() {{ add(new ServerAddress("127.0.0.1", 27017)); add(new ServerAddress("127.0.0.1", 27027)); add(new ServerAddress("127.0.0.1", 27037)); }});

    }

    @Override
    protected String getMappingBasePackage() {
        return "com.xxxx.mongodb.example.domain";
    }

}

如何更改它以支持 replset?但如果它的读数和其中一台服务器出现故障,我会收到一个错误..无论如何要重新连接?

4

3 回答 3

2

URI 方法应该可以工作,或者有一种更清晰的方法来使用服务器列表初始化副本集:

final List<ServerAddress> seeds = Arrays.asList(new ServerAddress("127.0.0.1", 27017),
                                                new ServerAddress("127.0.0.1", 27027),
                                                new ServerAddress("127.0.0.1", 27037));
final Mongo mongo = new Mongo(seeds);
于 2013-07-01T14:01:24.577 回答
1

我就是这样做的:

    String mongoURI="mongodb://myUsrName:pass@mongoServer-001.company.com:27017,mongoServer-002.company.com:27017,mongoServer-003.company.com:27017/myDBname?waitqueuemultiple=1500&amp;w=1&amp;maxpoolsize=40&amp;safe=true";
    MongoURI uri = new MongoURI(mongoURI);
    Mongo mongo = new Mongo(uri);

我在 URI 中指定了 3 个服务器(以及最大池大小等额外参数)。第三台服务器(mongoServer-003)是仲裁者,它不存储任何信息。当当前主服务器出现故障时,仲裁器有助于选择主服务器。看看这篇文章

使用此配置,即使主服务器出现故障,应用程序也可以继续工作。

于 2013-06-30T00:06:22.560 回答
1

您也可以使用 CustomEditorConfigurer 和实现 PropertyEditorRegistrar 的类。所以你的配置类需要这个:

    @Bean
    public static CustomEditorConfigurer customEditorConfigurer(){
        CustomEditorConfigurer configurer = new CustomEditorConfigurer();
        configurer.setPropertyEditorRegistrars(
                new PropertyEditorRegistrar[]{new ServerAddressPropertyEditorRegistrar()});
        return configurer;
    }

    @Override
    protected String getDatabaseName() {
        return authenticationDb;
    }

    @Override
    @Bean
    public MongoClient mongoClient() {
        MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress(host, port)), mongoCredentials(), mongoClientOptions());
        return mongoClient;
    }




public final class ServerAddressPropertyEditorRegistrar implements PropertyEditorRegistrar {
    @Override
    public void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(ServerAddress[].class, new ServerAddressPropertyEditor());
    }
}
于 2020-02-11T12:16:12.370 回答