2016-04-22 196 views
3

我使用的spring引导web应用程序连接到正在开箱即用的mongo db。我只使用以下属性:在Spring Boot中设置Mongo超时

spring.data.mongodb.host=myHost 
spring.data.mongodb.port=27017 
spring.data.mongodb.database=myDatabase 
spring.data.mongo.repositories.enabled=true 
spring.data.mongodb.username=myUser 
spring.data.mongodb.password=myPassword 

MongoDB的默认超时时间为10秒。我想配置超时。我试过 spring.data.mongodb.socketTimeout=2spring.data.mongodb.connectionTimeout=2

没有任何属性的工作。这是我可以在属性中指定的东西,Spring框架会照顾它,或者有人可以通过声明Bean来给出它的例子。

回答

2

MongoClientOptions是一个具有所需属性的类。

以编程方式 如果您以编程方式配置您的MongoDB,那么下面是代码段来帮助您。

DB mongoDb; 

MongoClient mongoClient = new MongoClient(new ServerAddress(url, port), 
          MongoClientOptions.builder() 
          .socketTimeout(3000) 
          .minHeartbeatFrequency(25) 
          .heartbeatSocketTimeout(3000) 
          .build()); 
mongoDb = mongoClient.getDB(dbname); 

XML配置 - 高级

<beans> 

    <mongo:mongo host="localhost" port="27017"> 
    <mongo:options connections-per-host="8" 
        threads-allowed-to-block-for-connection-multiplier="4" 
        connect-timeout="1000" 
        max-wait-time="1500}" 
        auto-connect-retry="true" 
        socket-keep-alive="true" 
        socket-timeout="1500" 
        slave-ok="true" 
        write-number="1" 
        write-timeout="0" 
        write-fsync="true"/> 
    </mongo:mongo/> 

</beans> 

另请参阅here为完整的文档。

1

这个问题特别针对Spring引导。我正在使用下面的方法,效果很好,请建议是否有方法不使用new并使用Spring进行配置。

import java.util.ArrayList; 
import java.util.List; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.mongodb.config.AbstractMongoConfiguration; 
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; 
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; 
import com.mongodb.Mongo; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoClientOptions; 
import com.mongodb.MongoCredential; 
import com.mongodb.ServerAddress; 

@Configuration 
@EnableMongoRepositories("com.myapp.repository") 
public class SpringMongoConfig extends AbstractMongoConfiguration { 

@Value("${myapp.mongodb.host}") 
private String host; 

@Value("${myapp.mongodb.port}") 
private int port; 

@Value("${myapp.mongodb.database}") 
private String mongoDB; 

@Value("${myapp.mongodb.userName}") 
private String userName; 

@Value("${myapp.mongodb.password}") 
private String password; 

@Value("${myapp.mongodb.socketTimeoutMS}") 
private int socketTimeout; 

@Value("${myapp.mongodb.connectionTimeoutMS}") 
private int connectionTimeout; 

@Override 
public MongoMappingContext mongoMappingContext() throws ClassNotFoundException { 
return super.mongoMappingContext(); 
} 

@Override 
@Bean 
public Mongo mongo() throws Exception { 

List<ServerAddress> servers = new ArrayList<ServerAddress>(); 
servers.add(new ServerAddress(host, port)); 

List<MongoCredential> creds = new ArrayList<MongoCredential>(); 
creds.add(MongoCredential.createCredential(userName, mongoDB, password.toCharArray())); 

MongoClientOptions builder = MongoClientOptions.builder().socketTimeout(socketTimeout).connectTimeout(connectionTimeout).build(); 

return new MongoClient(servers, creds, builder); 
} 

@Override 
protected String getDatabaseName() { 
return mongoDB; 
} 
} 
6

这将覆盖春季启动自动配置:

@Configuration 
public class MongoDbSettings { 

    @Bean 
    public MongoClientOptions mongoOptions() { 
     return MongoClientOptions.builder().socketTimeout(2000).build(); 
    } 

} 
+0

这工作:),谢谢。但是添加静态类似乎没有必要。 – OlgaMaciaszek

1

的问题是旧的,但对于那些谁与蒙戈DB Java驱动程序超时问题:设置maxConnectionIdleTime属性。

例春季启动:

import com.mongodb.MongoClient; 
import com.mongodb.MongoClientOptions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 
import org.springframework.boot.autoconfigure.mongo.MongoProperties; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.env.Environment; 

import javax.annotation.PreDestroy; 
import java.net.UnknownHostException; 

@Configuration 
@ConditionalOnClass(MongoClient.class) 
@EnableConfigurationProperties(MongoProperties.class) 
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory") 
public class MongoAutoConfiguration { 
    @Autowired 
    private MongoProperties properties; 

    @Autowired(required = false) 
    private MongoClientOptions options; 

    @Autowired 
    private Environment environment; 

    private MongoClient mongo; 

    @PreDestroy 
    public void close() { 
     if (this.mongo != null) { 
      this.mongo.close(); 
     } 
    } 

    @Bean 
    @ConditionalOnMissingBean 
    public MongoClient mongo() throws UnknownHostException { 
     this.options = options.builder().maxConnectionIdleTime(1000 * 60 * 4).build(); 
     this.mongo = this.properties.createMongoClient(this.options, this.environment); 
     return this.mongo; 
    } 
} 

一个非常有用的链接在这里:Java DriverJAVA-2535 com.mongodb.MongoSocketWriteException ......

0

要跟随你的主题,这将是最好的回答你的问题。 看起来你想在你的application.properties文件中设置一个超时时间。

为了做到这一点:

而不是

spring.data.mongodb.host=myHost 
spring.data.mongodb.port=27017 
spring.data.mongodb.database=myDatabase 

spring.data.mongodb.username=myUser 
spring.data.mongodb.password=myPassword 

试试这个

spring.data.monogdb.uri=mongodb://myUser:[email protected]:27017,myHost:27017/myDatabase?serverSelectionTimeoutMS=2000&connectTimeoutMS=2000 
spring.data.mongodb.database=myDatabase 
spring.data.mongo.repositories.enabled=true 

修改时间以毫秒为单位需要的时间。