2013-02-18 5 views
4

Я использую MongoDbFactory для подключения к mongodb с Java. Но служба mongo выдает исключение сокета не реже одного раза в час. Поэтому я вынужден перезапустить службу mongodb для восстановления операций. Я думаю, что это может быть результатом незакрытых связей с mongodb из java, а также MongoDbFactory не предоставляют мне функцию для закрытия соединения. Как я могу убедиться, что все соединения закрыты после определенного сеанса.Слишком много ошибок подключения при использовании mongodb с java

Это код, я использую:

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

ответ

2

Я столкнулся проблемы с Mongo объекта, а также. Обязательно позвоните по телефону myMongo.close(), когда это конкретное соединение будет разрешено.

Я хотел бы предложить хранить экземпляры, созданные с помощью new Mongo() в функции фабрики где-то, что позволило бы ему быть закрыты позже (SimpleMongoDbFactory может быть только местом для этого). Только что отметил, что это весна. Предложение остается: отследить ваши Mongo экземпляров.

+0

akaIDIOT спасибо за предложение, позвольте мне попробовать его. – abhips

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

}