sql >> データベース >  >> NoSQL >> MongoDB

MongoDB Javaドライバー3.0は、認証時に例外をキャッチできません

    MongoDB java APIの最近のバージョンは、別のデーモンモニタースレッド内で接続例外をスローします。そのため、それをキャッチできません。ランナーはスタックトレースにあります: com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run

    MongoDBクライアントの例外を監視するために、発生する可能性のある例外に対処し、必要なときにいつでも接続ステータスを確認できるリスナーを追加できます。それでもこれらの例外をキャッチすることはできませんが、アプリケーションは少なくともそれらを認識します。注意すべき点の1つは、接続が確立される(または失敗する)までに時間がかかる可能性があるため、1回限りの接続を作成することに関心がある場合は、接続がOKかどうかをチェックするスリープループを実装することをお勧めします。失敗/例外状態。このソリューションは、バージョン3.3( https://api.mongodb.com/java/3.3/ ):

    public class MongoStatusListener implements ServerListener {
    
        private boolean available = false;
    
        public boolean isAvailable() {
            return available;
        }
    
        @Override
        public void serverOpening(ServerOpeningEvent event) {}
    
        @Override
        public void serverClosed(ServerClosedEvent event) {}
    
        @Override
        public void serverDescriptionChanged(ServerDescriptionChangedEvent event) {
    
            if (event.getNewDescription().isOk()) {
                available = true;
            } else if (event.getNewDescription().getException() != null) {
                //System.out.println("exception: " + event.getNewDescription().getException().getMessage());
                available = false;
            }
        }
    }
    
    public MongoClient getMongoClient(String login, String password) {
    
        if (mongoClient != null) {
            return mongoClient;
        }
        MongoClientOptions.Builder optionsBuilder = new MongoClientOptions.Builder();
        MongoStatusListener mongoStatusListener = new MongoStatusListener();
        optionsBuilder.addServerListener(mongoStatusListener);
    
        this.mongoClient = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27017")),
            singletonList(MongoCredential.createCredential(
            login,
            "cookbook",
            password.toCharArray())
        ), optionsBuilder.build());
    
        this.mongoDatabase = mongoClient.getDatabase("cookbook");
        return mongoClient;
    }
    
    public boolean isAvailable() {
        return mongoStatusListener.isAvailable();
    }
    



    1. マングース5.x.xでarrayFiltersをどのように使用しますか?

    2. 日付をミリ秒からISODateオブジェクトに変換します

    3. mongodbのリスト内の重複する値を削除する方法

    4. RubyのMULTIブロック内のRedisからどのように読み取ることができますか?