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:[] }); var connection ; //====================新增資料 setConnect('第一次'); t2 = time(); varuserAddSql = 'INSERT INTO node_user(id,name,age) VALUES(0,?,?)'; varuserAddSql_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(); varuserGetSql = '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(); varuserDelSql = '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、回撥執行的順序。一開始還以為會按照發出申請的順序回撥,結果完全不是這樣。每次回撥的順序居然都不一樣。看來想要準確控制回撥的話,不能這麼放羊的。