代码之家  ›  专栏  ›  技术社区  ›  iowatiger08

Mongo没有在spring4javaapi中打开连接

  •  0
  • iowatiger08  · 技术社区  · 6 年前

    我有一个使用Spring4和Mongo数据库编写的API。当应用程序加载到本地WAS时,我可以看到应用程序将退出并连接到数据库。但是,当我去执行一个应该打开查询的函数时,我得到了socket closed错误。

    我的配置:

    @Bean
    public MongoDbFactory mongoDbFactory() throws Exception {
        logger.info("loading MongoDBFactory bean" );
        String PROCESS_ID_MONGO_KEY = "PROCESS_ID_MONGO";
    
        Credentials credentials = credentialsManager().getCredentialsFor(PROCESS_ID_MONGO_KEY);
    
        MongoClient mongoClient = new MongoClient(
                Arrays.asList(new ServerAddress(PropertiesManagerUtility.getKeyValue(CollectionType.CREDENTIAL, "mongo.url"), 27017)),
                Arrays.asList(MongoCredential.createPlainCredential(credentials.getUserid(), "$external", credentials.getPassword().toCharArray())),
                MongoClientOptions.builder()
                        .sslEnabled(true).connectTimeout(30)
                        .writeConcern(WriteConcern.MAJORITY)
                        .socketKeepAlive(true)
                        .build());
        return new SimpleMongoDbFactory(mongoClient, PropertiesManagerUtility.getKeyValue(CollectionType.CREDENTIAL, "mongo.db"));
    }
    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        logger.info("loading MongoTemplate bean" );
       // MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
        return new MongoTemplate(mongoDbFactory());
    }
    

    我的刀

    @Component("achResponseDMDao")
    public class AchResponseDMDaoImpl implements IBasicDao<AchResponseDM>{
        @Autowired
        MongoTemplate mongoTemplate;
    
    public AchResponseDMDaoImpl(MongoTemplate mongoTemplate){
        this.mongoTemplate = mongoTemplate;
    }
    
    @Override
    public AchResponseDM findByResponseCode( String responseCode){
        Query query = new Query(Criteria.where("responseCode").is(responseCode));        
        return mongoTemplate.findOne(query, AchResponseDM.class);
    }
    ...
    }
    

    问题是我认为Spring会给我一个使用MongoFactory的新连接,但是看起来原来的连接关闭了,不再创建了。我需要做什么?提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   iowatiger08    6 年前

    注入工厂而不是MongoTemplate实例会根据需要创建新连接。相应的DAOImpl @Autowired MongoFactory mongoFactory; 方法将创建 new mongoTemplate(mongoFactory).find(...) 或者其他。

    生成的DAO看起来像:

    @Component("achResponseDMDao")
    public class AchResponseDMDaoImpl implements IBasicDao<AchResponseDM>{
        @Autowired
        MongoFactory mongoFactory;
    
    @Override
    public AchResponseDM findByResponseCode( String responseCode){
        Query query = new Query(Criteria.where("responseCode").is(responseCode));        
        List<AchResponseDM> listOfResponses = mongoTemplate(mongoFactory).find(query, AchResponseDM.class);
        return (listOfResponses!=null && !listOfResponses.isEmpty())?listOfResponses.get(0):defaultNonNullResponse();
    }
    ...
    }