Keeping open a MongoDB database connection

前端 未结 3 1008
醉话见心
醉话见心 2020-12-07 22:14

In so many introductory examples of using MongoDB, you see code like this:

var MongoClient = require(\'mongodb\').MongoClient;
MongoClient.connect(\"mongodb:         


        
3条回答
  •  -上瘾入骨i
    2020-12-07 22:24

    The current accepted answer is correct in that you may keep the same database connection open to perform operations, however, it is missing details on how you can retry to connect if it closes. Below are two ways to automatically reconnect. It's in TypeScript, but it can easily be translated into normal Node.js if you need to.

    Method 1: MongoClient Options

    The most simple way to allow MongoDB to reconnect is to define a reconnectTries in an options when passing it into MongoClient. Any time a CRUD operation times out, it will use the parameters passed into MongoClient to decide how to retry (reconnect). Setting the option to Number.MAX_VALUE essentially makes it so that it retries forever until it's able to complete the operation. You can check out the driver source code if you want to see what errors will be retried.

    class MongoDB {
        private db: Db;
    
        constructor() {
            this.connectToMongoDB();
        }
    
        async connectToMongoDB() {
            const options: MongoClientOptions = {
                reconnectInterval: 1000,
                reconnectTries: Number.MAX_VALUE
            };
    
            try {
                const client = new MongoClient('uri-goes-here', options);
                await client.connect();
                this.db = client.db('dbname');
            } catch (err) {
                console.error(err, 'MongoDB connection failed.');
            }
        }
    
        async insert(doc: any) {
            if (this.db) {
                try {
                    await this.db.collection('collection').insertOne(doc);
                } catch (err) {
                    console.error(err, 'Something went wrong.');
                }
            }
        }
    }
    

    Method 2: Try-catch Retry

    If you want more granular support on trying to reconnect, you can use a try-catch with a while loop. For example, you may want to log an error when it has to reconnect or you want to do different things based on the type of error. This will also allow you to retry depending on more conditions than just the standard ones included with the driver. The insert method can be changed to the following:

    async insert(doc: any) {
        if (this.db) {
            let isInserted = false;
    
            while (isInserted === false) {
                try {
                    await this.db.collection('collection').insertOne(doc);
                    isInserted = true;
                } catch (err) {
                    // Add custom error handling if desired
                    console.error(err, 'Attempting to retry insert.');
    
                    try {
                        await this.connectToMongoDB();
                    } catch {
                        // Do something if this fails as well
                    }
                }
            }
        }
    }
    

提交回复
热议问题