4

私はMongoDbFactoryを使用してJavaでmongodbに接続します。ただし、mongoサービスは少なくとも1時間に1回ソケット例外をスローします。したがって、操作を復元するためにmongodbサービスを再起動する必要があります。これは、Javaからmongodbへの閉じられていない接続の結果である可能性があり、MongoDbFactoryは接続を閉じる関数を提供していません。特定のセッションの後にすべての接続が閉じられていることを確認するにはどうすればよいですか。

これは私が使用しているコードです:

package com.####.mongo.configuration;

import com.mongodb.Mongo;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class SpringMongoFeedConfig {

public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
    return new SimpleMongoDbFactory(new Mongo(), "feedDatabase");
}

public @Bean
MongoTemplate mongoTemplate() throws Exception {

    MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);


    return mongoTemplate; 
} 

}

と:

private String insertFeedsToMongo(FeedMongoDTO feedObject, FeedType type) throws UnknownHostException {
    try {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoFeedConfig.class);
        MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");

        switch (type) {

        case FOLLOW:
            mongoOperation.save(feedObject, "feedsByUid");
            break;

        case GENERAL:
            mongoOperation.save(feedObject, "allFeeds");
            break;

        default:
            break;
        }

        return feedObject.getId();

    } catch (Exception ex) {
        log.info("insertFeedsToMongo() : mongo Exception - ", ex);
        return null;
    }
}
4

2 に答える 2

2

Mongoオブジェクトにも問題が発生しました。myMongo.close()その特定の接続が完了したときに必ず呼び出すことで解決しました。

new Mongo()で作成したインスタンスをファクトリ関数のどこかに保存して、後で閉じることができるようにすることをお勧めします(そのSimpleMongoDbFactoryための場所かもしれません)。ちょうどそれが春のものであることに注意してください。提案は残っています:Mongoインスタンスを追跡します。

于 2013-02-18T10:29:37.873 に答える
2

akaIDIOTの提案で、私は次のように行いました

public class FeedMongoOperations {

public static transient Log log = LogFactory.getLog(FeedMongoOperations.class);

private Mongo mongo;
private SimpleMongoDbFactory dbFactory;
private MongoTemplate mongoTemplate;

public boolean openDbConnection() {
    try {
        MongoOptions options = new MongoOptions();
        options.connectionsPerHost = 100;
        mongo = new Mongo("localhost", options);
        dbFactory = new SimpleMongoDbFactory(mongo, "feedDatabase");
        MappingMongoConverter converter = new MappingMongoConverter(dbFactory, new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        mongoTemplate = new MongoTemplate(dbFactory, converter);

        return true;
    } catch (Exception e) {
        return false;
    }
}

public boolean closeDbConnection() {
    try {
        mongoTemplate = null;
        dbFactory = null;
        mongo.close();

        return true;
    }
}

public String save(FeedMongoDTO feed, String collectionName) {
    try {
        mongoTemplate.save(feed, collectionName);
        return feed.getId();
    } catch (Exception ex) {
        return null;
    } 
}

public FeedMongoDTO getFeed(String mongoId, String collectionName) {

    try {
        FeedMongoDTO feedMongoDTO = mongoTemplate.findOne(new Query(Criteria.where("id").is(mongoId)), FeedMongoDTO.class,
                collectionName);
        return feedMongoDTO;
    } catch (Exception ex) {
        return null;
    }
}

}
于 2013-03-25T20:05:47.920 に答える