3 votes

Mongodb insérer en vrac délai de connexion

Je réalise une opération groupée où j'upsert 10000 éléments toutes les 2 heures dans ma base de données mongodb. Le code ressemble à ceci

let bulk = models.Product.collection.initializeUnorderedBulkOp();
...
    if (bulk.length > 0) {
        bulk.find({
            "$or": [
                {
                    "updatedAt": {
                        "$lt": timestamp
                    }
                },
                {
                    "discount": {
                        "$eq": 0
                    }
                }
            ]

        }).remove()
        bulk.execute((error, result) => {
            if (error) {
                console.error('Erreur lors de l'insertion des produits' + JSON.stringify(error))
            }
            else {
                console.log('Insertion réussie de ' + result.nInserted + ' upserted ' + result.nUpserted + ' matched ' + result.nMatched + ' modified ' + result.nModified + ' removed ' + result.nRemoved)
            }
        })
    }
    else {
        console.log('Il n'y avait pas d'opérations groupées à exécuter ' + products.length)
    }
}

Ma connexion continue d'expirer. Mes options de connexion mongoose ressemblent à ceci

let options = {
    mongos: {
        ssl: true,
        sslValidate: true,
        sslCA: ca,
    }
}

Je suis bien conscient de ce paramètre de connexion discuté dans d'autres fils de stackoverflow

server: {
    socketOptions: {
        keepAlive: 300000,
        connectTimeoutMS: 30000
    }
}

J'ai lu la documentation pour keepAlive et connectTimeoutMS mais comment savoir la bonne valeur pour les deux, Ai-je besoin de socketTimeoutMS également?

Merci pour vos conseils à l'avance

MISE À JOUR 1

Je continue de recevoir cette erreur:

{"name":"MongoError","message":"connect to aws-ap-southeast-1-portal.2.dblayer.com:15284 timed out"}

Maintenant, mes options de connexion ressemblent à ceci //Options pour la base de données compose.io

let options = {
    mongos: {
        ssl: true,
        sslValidate: true,
        sslCA: ca,
    },
    server: {
        socketOptions: {
            keepAlive: 300000,
            connectTimeoutMS: 300000
        }
    },
    replset: {
        socketOptions:
        {
            keepAlive: 300000,
            connectTimeoutMS: 300000
        }
    }
}

1voto

Zahid Riaz Points 1393

La diminution du lot n'a pas été d'une grande aide pour moi, mais plutôt l'augmentation des valeurs de délai de connexion.

Voici ma chaîne de connexion qui a résolu le problème pour moi.

MONGO_URI=mongodb://user:password@127.0.0.1:27017/dbname?keepAlive=true&poolSize=30&autoReconnect=true&socketTimeoutMS=360000&connectTimeoutMS=360000

0voto

molokoloco Points 1626

D'accord, j'ai réduit mon opération en masse par lot de 100 au lieu de 1000 et ça fonctionne bien maintenant.. Ça fonctionnait bien pour 1000 quand je faisais :

bulk.insert(programme);

Mais maintenant, en faisant ceci, ça ne fonctionne pas pour 1000/bulk :

bulk.find({ eventId: programme.eventId }).upsert().replaceOne(programme);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X