2013-02-18 60 views
4

我使用MongoDbFactory通过Java连接到mongodb。但是mongo服务每小时至少抛出一次socket异常。因此我被迫重启mongodb服务来恢复操作。我认为这可能是由于java关闭了mongodb的连接,MongoDbFactory也没有提供关闭连接的功能。我如何确保所有连接在特定会话后关闭。与java一起使用mongodb时连接错误太多

这是我使用的代码:我遇到的问题与Mongo对象以及

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; 
    } 
} 

回答

2

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; 
} 

}

和。确保在特定连接完成后致电myMongo.close()解决它。

我建议储存在你的工厂函数创建new Mongo()某处你那情况将使其能够在以后关闭(SimpleMongoDbFactory可能只是对那个地方)。刚才注意到这是一个春天的事情。建议仍然存在:跟踪您的Mongo实例。

+0

akaIDIOT感谢做,让我试试吧。 – abhips 2013-02-18 10:43:37

1

随着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; 
    } 
} 

}