4

我使用 MongoDbFactory 通过 Java 连接到 mongodb。但是 mongo 服务每小时至少抛出一次套接字异常。因此,我被迫重新启动 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 回答