node mysql 等待完成_node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录...

Node + mysql 实现基础的增删改查,以及性能测试。

网上有很多这样的例子,我也是找来学习的。

感觉node对mysql的操作非常简单,也很实用,比如自带防止sql注入的功能,一开始还担心注入漏洞呢,后来发现完全没必要。

返回的记录集直接就是json格式,都不用转换,直接就可以用。也不用事先定义实体类。非常方便。

基本步骤:

1、  创建mysql对象

2、  设置连接字符串

3、  createConnection

4、  写sql语句和参数值

5、  先connection.connect(),然后再connection.query()就搞定了。

6、  connection.end()

7、  最后等待返回结果

基础代码就不贴了,百度一下有很多,后面有修改后的代码。

不用区分增删改查,反正都是这个套路,只要改改sql语句和参数就可以了。比ado.net简单和方便多了。

然后就是对性能的了解,每个步骤都花了多长时间?有没有坑,会不会出现浪费性能的写法?

首先在node里面使用require()加载的对象,都会进入缓存,下次再使用速度就快了,因为会从缓存里直接提取。

然后要看看其他几个写法的性能,最后看看数据库操作的速度。

上一篇写了一个精确取时间的,就是为了这里的测试性能,也就是每个语句的执行时间。

为了更好的记录运行过程和时间,定义一个简单的类来记录

var msg={

title:'增删改查的演示',

startTime:t1,

endTime:0,

items:[]

};

每个步骤都可以push到items里面。这样程序执行步骤和时间就可以准确的记录下来了。

完整代码如下:

/**

* Created by jyk00 on 2019/3/29.

* mysql的测试*/

var time = require('../preciseTime').time;var num= 4;//开始运行时间

var t1 =time();//跟踪记录

var msg={

title:'增删改查的演示',

startTime:t1,

endTime:0,

items:[]

};var t2 =time();var mysql = require('mysql');var t3 =time();

msg.items.push({

title:'创建mysql对象用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});

t2=time();var mysql2 = require('mysql');

t3=time();

msg.items.push({

title:'再次创建mysql对象用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});

t2=time();var cnString = require('../sqlConnection.json');

t3=time();

msg.items.push({

title:'获取cnString用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});varconnection ;//==================== 添加数据

setConnect('第一次');

t2=time();var userAddSql = 'INSERT INTO node_user(id,name,age) VALUES(0,?,?)';var userAddSql_Params = ["张洒 ' -- " , 55];//增 add

connection.query(userAddSql,userAddSql_Params,function(err, result) {if(err){

console.log('[INSERT ERROR ] 注入 - ',err.message);return;

}

logCallback('添加数据完成用时',tadd1);

});

connection.end();

t3=time();var tadd1 = time(); //记录开始开始添加数据时间

msg.items.push({

title:'调用添加用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});//======================= 修改数据

setConnect('第二次');

t2=time();var userModSql = 'UPDATE node_user SET name = ?,age = ? WHERE id = ?';var userModSql_Params = ['Hello World',99,7];//改 up

connection.query(userModSql,userModSql_Params,function(err, result) {if(err){

console.log('[UPDATE ERROR] - ',err.message);return;

}

logCallback('修改数据用时',tupdate1,result);

});

connection.end();

t3=time();var tupdate1 = time(); //记录开始开始添加数据时间

msg.items.push({

title:'调用修改用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});//========================= 查询数据

setConnect('第三次');

t2=time();var userGetSql = 'SELECT * FROM node_user where id <5';//查 query

connection.query(userGetSql,function(err, result) {if(err){

console.log('[SELECT ERROR] - ',err.message);return;

}

logCallback('查询数据用时',tselect1,result);

});

connection.end();var tselect1 = time();//记录开始查询时间

t3=time();

msg.items.push({

title:'调用查询用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});//====================== 删除数据

setConnect('第四次');

t2=time();var userDelSql = 'DELETE FROM node_user WHERE id = 7';

connection.query(userDelSql,function(err, result) {if(err){

console.log('[DELETE ERROR] - ',err.message);return;

}

logCallback('删除数据用时',tdel1,result);

});

connection.end();var tdel1 =time();

msg.items.push({

title:'调用删除用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});//外部调用执行完毕用时

t3 =time();

msg.items.push({

title:'外部调用执行完毕用时:' + (t3-t1),

startTime:t1,

endTime:t3,

items:[]

});//设置信息,开始连接

functionsetConnect(title){

t2=time();

connection=mysql.createConnection(cnString);

t3=time();

msg.items.push({

title:title+ '创建connection对象用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});

t2=time();

connection.connect();

t3=time();

msg.items.push({

title:title+ 'connect用时:' + (t3-t2),

startTime:t2,

endTime:t3,

items:[]

});

}//记录回调

functionlogCallback(title,tstart,result){var tend =time();

msg.items.push({

title:title+ (tend-tstart) + '_',

startTime:tstart,

endTime:tend,

items:[]

});

num--;if (num == 0){

msg.items.push({

title:'最后回调' + (tend -t1),

startTime:t1,

endTime:tend,

items:[]

});

console.log(JSON.stringify(msg));

}

}

运行后跟踪记录如下:json格式,便于查看。

{"title": "增删改查的演示","startTime": 2542410048.328554,"endTime": 0,"items": [

{"title": "创建mysql对象用时:2.3957343101501465","startTime": 2542410048.366954,"endTime": 2542410050.762688,"items": []

},

{"title": "获取cnString用时:0.6924800872802734","startTime": 2542410050.788715,"endTime": 2542410051.481195,"items": []

},

{"title": "第一次创建connection对象用时:112.34650135040283","startTime": 2542410051.662955,"endTime": 2542410164.009456,"items": []

},

{"title": "第一次connect用时:3.8489623069763184","startTime": 2542410164.022256,"endTime": 2542410167.871218,"items": []

},

{"title": "调用添加用时:1.268907070159912","startTime": 2542410167.893405,"endTime": 2542410169.162312,"items": []

},

{"title": "第二次创建connection对象用时:0.16170692443847656","startTime": 2542410169.179378,"endTime": 2542410169.341085,"items": []

},

{"title": "第二次connect用时:0.7057070732116699","startTime": 2542410169.347059,"endTime": 2542410170.052766,"items": []

},

{"title": "调用修改用时:0.18773317337036133","startTime": 2542410170.069406,"endTime": 2542410170.257139,"items": []

},

{"title": "第三次创建connection对象用时 :0.0669870376586914","startTime": 2542410170.268659,"endTime": 2542410170.335646,"items": []

},

{"title": "第三次connect用时 :0.12415933609008789","startTime": 2542410170.338206,"endTime": 2542410170.462365,"items": []

},

{"title": "调用查询用时:0.059305667877197266","startTime": 2542410170.467059,"endTime": 2542410170.526365,"items": []

},

{"title": "第四次创建connection 对象用时:1.0282669067382812","startTime": 2542410170.534046,"endTime": 2542410171.562313,"items": []

},

{"title": "第四次connect用时:0.11946725845336914","startTime": 2542410171.579806,"endTime": 2542410171.699273,"items": []

},

{"title": "调用删除用时:-0.0038399696350097656","startTime": 2542410171.703113,"endTime": 2542410171.699273,"items": []

},

{"title": "外部调用执行完毕用时:123.41466474533081","startTime": 2542410048.328554,"endTime": 2542410171.743219,"items": []

},

{"title": "修改数据用时16.291846752166748_","startTime": 2542410170.258419,"endTime": 2542410186.550266,"items": []

},

{"title": "查询数据用时20.791049003601074_","startTime": 2542410170.525512,"endTime": 2542410191.316561,"items": []

},

{"title": "添加数据完成用时23.376222610473633_","startTime": 2542410169.165725,"endTime": 2542410192.541948,"items": []

},

{"title": "删除数据用时21.536436080932617_","startTime": 2542410171.734686,"endTime": 2542410193.271122,"items": []

},

{"title": "最后回调144.94256782531738","startTime": 2542410048.328554,"endTime": 2542410193.271122,"items": []

}

]

}

分析一下记录可以发现:

1、第一次 require('mysql') 有点慢,再次调用就快了很多,可以证明确实是使用了缓存。

2、重点是 mysql.createConnection(cnString),第一次执行居然需要100多号码,不知道他都做了什么,不过好在再次执行的时间就快了很多,只需要0.5毫秒左右,似乎也是用了缓存。既然以后就快了,那么就不用担心写多了导致效率下降的问题了。

3、数据操作的执行时间,大概是20-50毫秒这个级别的,感觉不是太快,和 c# + mssql的操作似乎差不多。

4、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Node.js和MySQL实现增删改查接口的示例代码: ```javascript const express = require('express'); const mysql = require('mysql'); const bodyParser = require('body-parser'); const app = express(); // 配置body-parser中间件 app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); // 创建数据库连接池 const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'test' }); // 查询数据接口 app.get('/api/select', (req, res) => { pool.getConnection((err, connection) => { if (err) { console.log(err); res.send({ code: 400, message: '数据库连接出错' }); } else { connection.query('SELECT * FROM users', (err, results) => { if (err) { console.log(err); res.send({ code: 400, message: '查询数据出错' }); } else { res.send({ code: 200, data: results }); } connection.release(); }); } }); }); // 新增数据接口 app.post('/api/insert', (req, res) => { pool.getConnection((err, connection) => { if (err) { console.log(err); res.send({ code: 400, message: '数据库连接出错' }); } else { const { name, age, gender } = req.body; connection.query('INSERT INTO users (name, age, gender) VALUES (?, ?, ?)', [name, age, gender], (err, results) => { if (err) { console.log(err); res.send({ code: 400, message: '新增数据出错' }); } else { res.send({ code: 200, message: '新增数据成功' }); } connection.release(); }); } }); }); // 修改数据接口 app.put('/api/update', (req, res) => { pool.getConnection((err, connection) => { if (err) { console.log(err); res.send({ code: 400, message: '数据库连接出错' }); } else { const { name, age, gender, id } = req.body; connection.query('UPDATE users SET name = ?, age = ?, gender = ? WHERE id = ?', [name, age, gender, id], (err, results) => { if (err) { console.log(err); res.send({ code: 400, message: '修改数据出错' }); } else { res.send({ code: 200, message: '修改数据成功' }); } connection.release(); }); } }); }); // 删除数据接口 app.delete('/api/delete', (req, res) => { pool.getConnection((err, connection) => { if (err) { console.log(err); res.send({ code: 400, message: '数据库连接出错' }); } else { const { id } = req.body; connection.query('DELETE FROM users WHERE id = ?', [id], (err, results) => { if (err) { console.log(err); res.send({ code: 400, message: '删除数据出错' }); } else { res.send({ code: 200, message: '删除数据成功' }); } connection.release(); }); } }); }); // 监听端口 app.listen(3000, () => { console.log('服务器已启动,端口:3000'); }); ``` 这里使用了`body-parser`中间件来解析POST请求的请求体,使用了MySQL的连接池来管理数据库连接,防止频繁创建和销毁连接导致的性能损失。在每个接口中,都先从连接池中获取一个连接,然后执行相应的SQL语句,并根据执行结果返回不同的响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值