1

spring-data と MongoDB で replset をサポートするように Java コードを変更する方法を知りたいです。

私は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 のデータベースがダウンした場合、他のデータベースの 1 つがプライマリになることがわかります。これにより、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 をサポートするように変更するにはどうすればよいですか? しかし、その読み取りとサーバーの1つがダウンすると、エラーが発生します..とにかく再接続しますか?

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 台のサーバーを指定します (最大プール サイズなどの追加パラメーターも指定します)。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 に答える