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

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

浙公网安备 33010602011771号