原生NodeJS操作MongoDB数据库存在的性能问题

构造函数是实例化的时候就会执行:

class Db{
    constructor(){ //构造函数,实例化的时候会调用
        console.log('开始执行构造函数')
        this.connect()
    }
    connect(){
        console.log("连接数据库")
    }
    find(){
        console.log("查询数据库")
    }
}

const db=new Db()

/**
 * 开始执行构造函数
 * 连接数据库
 */

Db实例化后就会执行构造函数

当我们多次实例化之后,就会多次调用构造函数,从而多次调用数据库:

//构造函数是实例化的时候就会执行:
class Db{
    constructor(){ //构造函数,实例化的时候会调用
        console.log('开始执行构造函数')
        this.connect()
    }
    connect(){
        console.log("连接数据库")
    }
    find(){
        console.log("查询数据库")
    }
}

const db1=new Db()
const db2=new Db()

/**
 * 开始执行构造函数
 * 连接数据库
 * 开始执行构造函数
 * 连接数据库
 */

所以单例就是实现,多次实例化的时候,只执行一次构造函数

实现单例:

class Db{
    static getInstance(){ //实现单例
        if(!Db.instance){ //没有实例化(没有intance),就进行实例化
            Db.instance = new Db()
        }
        return Db.instance //有实例化,直接返回实例
    }
    constructor(){ //构造函数,实例化的时候会调用
        console.log('开始执行构造函数')
        this.connect()
    }
    connect(){
        console.log("连接数据库")
    }
    find(){
        console.log("查询数据库")
    }
}

const db1 = Db.getInstance() //相当于 db1=new Db(),会执行构造函数
const db2 = Db.getInstance() //相当于 db2=Db.instance,没有进行实例化,不执行构造函数

/**
 * 开始执行构造函数
 * 连接数据库
 */

创建了两个实例,但只执行了一次构造函数,相当于只实例化了一次

原生NodeJS 操作MongoDB数据库,每次 对数据库的增删改查操作都要先连接一次数据库,因此会有性能问题:

const MongoClient = require('mongodb').MongoClient;

const dataUrl = 'mongodb://admin:123@localhost:27017/'
const dbName = 'hello'

console.time('connect_time')
console.time('time_find')
MongoClient.connect(dataUrl, function (err, client) { //回调函数返回client对象
    if(err){
        console.log("连接数据库失败:",err)
        return
    }
    console.log("连接数据库成功") 
    console.timeEnd('connect_time')
    const db = client.db(dbName); 
    //查询数据
    db.collection('user').find({}).toArray((err,data)=>{
        if(!err){
            console.log("查询数据成功")
            console.timeEnd('time_find')
            client.close() 
        }
    });
})


/**
 * 连接数据库成功
 * connect_time: 45.681ms
 * 查询数据成功
 * time_find: 58.800ms
 */

数据库的查询时间是5s多,但是连接数据库需要 4s多,加入每次实例化都执行一次构造函数,都去连接一次数据库,将会有记得的性能损耗

const MongoClient = require('mongodb').MongoClient;

const dataUrl = 'mongodb://admin:123@localhost:27017/'
const dbName = 'hello'

console.time('connect_time')
console.time('time_add')
console.time('time_find')
console.time('time_update')
console.time('time_delete')
MongoClient.connect(dataUrl, function (err, client) {
    if(err){
        console.log("连接数据库失败:",err)
        return
    }
    console.log("连接数据库成功")
    console.timeEnd('connect_time')
    const db = client.db(dbName); 
    //添加数据
    db.collection('user').insertOne({ "name": "李华","age":33 }, function (err, result) {
        if(!err){
            console.log("添加数据成功")
            console.timeEnd('time_add')
            client.close() 
        }
    })
    //查询数据
    db.collection('user').find({}).toArray((err,data)=>{
        if(!err){
            console.log("查询数据成功")
            console.timeEnd('time_find')
            client.close() 
        }
    });
    //修改数据
    db.collection('user').updateOne({ "name": "李华" }, { $set: { "age": 60 } }, (err, result) => {
        if (!err) {
            console.log("修改数据库中的数据成功")
            console.timeEnd('time_update')
            client.close()
        }
    })
    //删除一条数据
    db.collection('user').deleteOne({ "name": "sally" }, (err) => {
        if (!err) {
            console.log("删除数据库中的数据成功")
            console.timeEnd('time_delete')
            client.close()
        }
    })
})

原生NodeJS操作MongoDB数据库存在的性能问题

除了每次都需要连接一次数据库外,在整个操作完成的过程中,连接数据库的操作更是极大的消耗了时间