• 原生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()
            }
        })
    })
    

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

  • 相关阅读:
    2016.7.15
    2016.7.15
    2016.7.8
    2016.7.8
    2016.7.6
    2016.7.1--测评官网系列--手机行业
    2016.6.28--测评官网系列--牛奶行业
    2016.6.27
    Java中的Timer和TimerTask在Android中的用法
    Android 计时器Timer用法
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/13174481.html
Copyright © 2020-2023  润新知