2013-02-18 56 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; 
    } 
} 

}