如何在春季启动应用程序中给mongodb socketkeepalive?

时间:2019-02-18 08:00:53

标签: mongodb spring-boot

在春季启动中,如果我们要连接到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,但找不到任何

2 个答案:

答案 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)