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

node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录的更多相关文章

  1. 使用 NodeJS+Express+MySQL 实现简单的增删改查

    关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www. ...

  2. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  3. python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查

    python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...

  4. mysql 的基本操作总结--增删改查

    本文只是总结一下mysql 的基本操作,增删改查,以便忘记的时候可以查询一下 1.创建数据库 语法:CREATE DATABASES 数据库名; 例子: CREATE DATABASES studen ...

  5. Mysql数据表的增删改查

    ---恢复内容开始--- Mysql数据表的增删改查 1.创建表   语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...

  6. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  7. MySQL数据库安装,MySQL数据库库的增删改查,表的增删改查,表数据的基本数据类型

    一 MySQL的安装 MySQL现在属于甲骨文公司,所以和java语言匹配度较高,同时甲骨文公司的另一种数据库为Oracle,两者同为关系型数据库,即采用关系模型来组织数据,以行和列的方法来存储数据的 ...

  8. Node.js + MySQL 实现数据的增删改查

    通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...

  9. 基于nodejs+express+mysql+webstorm+html的 增删改查

    一.工具准备 Nodejs框架,WebStorm.Mysql服务.Navicat.此篇文章只讲项目的搭建过程,至于Nodejs,WebStorm.Mysql的下载.安装与配置网上资源很多,请自行查阅, ...

  10. 利用Express+MySQL进行简单的增删改查

    前言: 随着JavaScript语言的快速发展,其功能越来越强大,能做的事情也越来越多. 目前,web前端工程师能够利用NodeJS搭建服务,也成为了越来越多互联网公司对前端开发的硬性要求. 本文主要 ...

随机推荐

  1. 快速构建SPA框架SalutJS--项目工程目录 一

    起因 刚进公司那会儿,接的是一个微信APP应用,SPA是前人搭起来的,用到的技术主要是backbone和zepto.后来那人走了,就卤煮一个人把项目接了下来.项目越是到后面,越发觉了诸多弊端,不停的增 ...

  2. Jvm启动,关闭及对应钩子

    很多时候应用服务启动或关闭会做一些预加载(比如缓存,定时任务启动等)或收尾处理工作(比如程序失败记录等) 1. 首先看下Spring框架服务启动加载操作实现,直接上代码 继承实现接口Applicati ...

  3. ThinkPHP5.1 + tufanbarisyildirim 解析apk

    摘要 对于apk,我可以说只会安装,并不知道其中有什么内容需要记录下来.这次公司做一个关于电视机顶盒的项目.对于这个陌生的项目,刚开始真是一脸懵逼,完全不知道如何下手. 因为这类的项目完全没有接触过, ...

  4. 单例模式的优化之路(java)

    1.概述 最近在优化公司以前老项目的代码时,发现有些类的代码频繁地创建和销毁对象,资源消耗比较严重.针对这些做了一些优化,改用单例模式,避免频繁的创建和销毁对象,说起单例模式,相信每个人都会写,接下来 ...

  5. 【ElasticSearch篇】--ElasticSearch从初识到安装和应用

    一.前述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,在企业中全文搜索时,特别常用. 二.常用概念 clu ...

  6. 【Netty】(7)---搭建websocket服务器

    [Netty](7)---搭建websocket服务器 说明:本篇博客是基于学习某网有关视频教学. 目的:创建一个websocket服务器,获取客户端传来的数据,同时向客户端发送数据 一.服务端 1. ...

  7. SpinnerViewPop【PopWindow样式(单选)、Dialog样式(单选+多选)的下拉菜单】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 对下拉菜单的文本区域和列表区域进行了封装.包括两种展现方式:popwindow(单选).dialog(单选+多选) 因为该封装需要在 ...

  8. ZooKeeper 03 - ZooKeeper集群的脑裂问题 (Split Brain问题)

    目录 1 ZooKeeper的主从机制 2 什么是ZooKeeper的脑裂 2.1 脑裂现象的表现 2.2 为什么会出现脑裂 3 ZooKeeper如何解决"脑裂" 3.1 3种可 ...

  9. with open为什么会自动关闭文件流

    操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器.我们来看一个例子 #!/usr/bin/env python # -*- ...

  10. QUIC协议原理分析(转)

    之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...