天天看點

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();

//跟蹤記錄

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