原生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() } }) })
除了每次都需要连接一次数据库外,在整个操作完成的过程中,连接数据库的操作更是极大的消耗了时间