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();
//跟蹤記錄
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();
title:'再次建立mysql對象用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
var cnString = require('../sqlConnection.json');
title:'擷取cnString用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
var connection ;
//==================== 添加資料
setConnect('第一次');
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();
var tadd1 = time(); //記錄開始開始添加資料時間
title:'調用添加用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
//======================= 修改資料
setConnect('第二次');
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);
var tupdate1 = time(); //記錄開始開始添加資料時間
title:'調用修改用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
//========================= 查詢資料
setConnect('第三次');
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);
var tselect1 = time();//記錄開始查詢時間
title:'調用查詢用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
//====================== 删除資料
setConnect('第四次');
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);
var tdel1 = time();
title:'調用删除用時:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]
//外部調用執行完畢用時
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、回調執行的順序。一開始還以為會按照發出申請的順序回調,結果完全不是這樣。每次回調的順序居然都不一樣。看來想要準确控制回調的話,不能這麼放羊的。
原文位址
https://www.cnblogs.com/jyk/p/10654353.html