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

  • 相关阅读:
    【leetcode】1295. Find Numbers with Even Number of Digits
    【leetcode】427. Construct Quad Tree
    【leetcode】1240. Tiling a Rectangle with the Fewest Squares
    【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
    【leetcode】1291. Sequential Digits
    【leetcode】1290. Convert Binary Number in a Linked List to Integer
    【leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
    【leetcode】1289. Minimum Falling Path Sum II
    【leetcode】1288. Remove Covered Intervals
    【leetcode】1287. Element Appearing More Than 25% In Sorted Array
  • 原文地址:https://www.cnblogs.com/jyk/p/10654353.html
Copyright © 2011-2022 走看看