zoukankan      html  css  js  c++  java
  • 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();
    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、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。

  • 相关阅读:
    JS_ ','逗号
    JS_prettyBanner[说给自己听]
    JS_关键字详细
    CSS_圣杯
    JS_ifream通信
    [转]<!DOCTYPE html>
    JS_ImageLazylode[说给自己听]
    CSS_负边距
    JS_waterfall[说给自己听]
    JS_call,apply
  • 原文地址:https://www.cnblogs.com/jyk/p/10654353.html
Copyright © 2011-2022 走看看