在春季启动中,如果我们要连接到mongodb,我们可以为mongodb创建一个配置文件,或在 application.properties
中写入数据源我正在按照第二种方式
对我来说,我是这个错误
"Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
。
spring.data.mongodb.uri = mongodb://mongodb0.example.com:27017/admin
如果我不使用我的应用程序6/7小时,然后在此之后尝试访问任何控制器以从Mongodb检索数据,则我将收到此错误消息。经过1/2次尝试,我就能得到
问题-这是mongodb的正常行为吗? 因此,就我而言,它是在某些特定时间后关闭插座的
我阅读了一些博客,您可以在其中写上 socket-keep-alive ,因此连接池不会关闭
在spring boot mongodb连接中,我们可以像uri那样传递选项
spring.data.mongodb.uri = mongodb://mongodb0.example.com:27017/admin/?replicaSet=test&connectTimeoutMS=300000
因此,我想为spring.data.mongodb.uri提供 socket-keep-alive 选项,例如此处的copysetset。
我搜索了official site,但找不到任何
答案 0 :(得分:2)
您可以使用MongoClientOptionsFactoryBean通过此选项。
public MongoClientOptions mongoClientOptions() {
try {
final MongoClientOptionsFactoryBean bean = new MongoClientOptionsFactoryBean();
bean.setSocketKeepAlive(true);
bean.afterPropertiesSet();
return bean.getObject();
} catch (final Exception e) {
throw new BeanCreationException(e.getMessage(), e);
}
}
以下是通过扩展AbstractMongoConfiguration进行配置的示例:
@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {
//@Value: inject property values into components
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String database;
/**
* Configure the MongoClient with the uri
*
* @return MongoClient.class
*/
@Override
public MongoClient mongoClient() {
return new MongoClient(new MongoClientURI(uri,mongoClientOptions().builder()));
}
答案 1 :(得分:2)
您可以通过提供MongoClientOptions bean来实现。 Spring Data的MongoAutoConfiguration将选择此MongoClientOptions bean并在以下位置进一步使用它:
class CampaignSerializer
attributes :id, :total,
attribute :total do |campaign|
campaign.campaign_codes.count
end
end
还要注意,从mongo-driver 3.5版(从spring-data-mongodb的2.0.0版开始,由spring-data使用)之后,不建议使用socket-keep-alive选项(默认为true)