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:[] }); var connection ; //==================== 添加数据 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:[] }); //设置信息,开始连接 function setConnect(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:[] }); } //记录回调 function logCallback(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、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。