Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 是否可以为单个选择更改插座timout?_Mongodb_Grails - Fatal编程技术网

Mongodb 是否可以为单个选择更改插座timout?

Mongodb 是否可以为单个选择更改插座timout?,mongodb,grails,Mongodb,Grails,我们的项目使用mongodb来存储文档。我们在DataSource.groovy文件中配置了它,socketTimeout为60000。我们的大多数查询都没有接近该阈值的任何位置,但我假设我们有它,以防出现问题 无论如何,现在我正在处理一个被称为长时间运行的查询。我们几乎可以保证正在进行表空间扫描,我们承认这一点,目前还可以接受。问题是我们当前拥有的数据量导致随机情况下超过套接字超时。另外一个问题是,我们预计未来的数据量将大幅增长 所以我的问题是,是否可以增加/删除单个mongodb selec

我们的项目使用mongodb来存储文档。我们在DataSource.groovy文件中配置了它,socketTimeout为60000。我们的大多数查询都没有接近该阈值的任何位置,但我假设我们有它,以防出现问题

无论如何,现在我正在处理一个被称为长时间运行的查询。我们几乎可以保证正在进行表空间扫描,我们承认这一点,目前还可以接受。问题是我们当前拥有的数据量导致随机情况下超过套接字超时。另外一个问题是,我们预计未来的数据量将大幅增长

所以我的问题是,是否可以增加/删除单个mongodb select的套接字超时?我发现了以下几点:

grailsApplication.mainContext.getBean('mongoDatastore').mongo.mongoOptions.socketTimeout = 0
这似乎是可行的,但这也改变了应用程序范围内的所有内容的套接字超时,这是我们不希望看到的。救命啊

更新:经过大量的尝试和错误,我找到了一种打开另一个mongo连接的方法,该连接重用了配置,但没有使用socketTimeout,似乎可以工作

class MongoService {
    def grailsApplication

    def openMongoClientWithoutSocketTimeout() {
        def datastore = grailsApplication.mainContext.getBean('mongoDatastore')
        def config = grailsApplication.config.grails.mongo
        def credentials = MongoCredential.createCredential(config.username, config.databaseName, config.password.toCharArray())
        def options = MongoClientOptions.builder()
            .autoConnectRetry(config.options.autoConnectRetry)
            .connectTimeout(config.options.connectTimeout)
            .build()

        new MongoClient(datastore.mongo.getAllAddress(), [credentials, credentials], options)
    }

    def selectCollection(mongoClient, collection) {
        def mongoConfig = grailsApplication.config.grails.mongo
        mongoClient.getDB(mongoConfig.databaseName).getCollection(collection)
    }
}

不确定这是否是最简单的解决方案…

您使用的mongo版本是什么?可能的话我能帮你吗? 从文档页面:

    db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)

2.13我看不到maxTimeMS选项。只有一个maxTime()选项,我们尝试过,但没有覆盖配置中的socketTimeout选项。它从2.6版开始提供,似乎您没有更多选项。