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、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。
node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录的更多相关文章
- 使用 NodeJS+Express+MySQL 实现简单的增删改查
关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www. ...
- Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
- python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查
python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...
- mysql 的基本操作总结--增删改查
本文只是总结一下mysql 的基本操作,增删改查,以便忘记的时候可以查询一下 1.创建数据库 语法:CREATE DATABASES 数据库名; 例子: CREATE DATABASES studen ...
- Mysql数据表的增删改查
---恢复内容开始--- Mysql数据表的增删改查 1.创建表 语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- MySQL数据库安装,MySQL数据库库的增删改查,表的增删改查,表数据的基本数据类型
一 MySQL的安装 MySQL现在属于甲骨文公司,所以和java语言匹配度较高,同时甲骨文公司的另一种数据库为Oracle,两者同为关系型数据库,即采用关系模型来组织数据,以行和列的方法来存储数据的 ...
- Node.js + MySQL 实现数据的增删改查
通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...
- 基于nodejs+express+mysql+webstorm+html的 增删改查
一.工具准备 Nodejs框架,WebStorm.Mysql服务.Navicat.此篇文章只讲项目的搭建过程,至于Nodejs,WebStorm.Mysql的下载.安装与配置网上资源很多,请自行查阅, ...
- 利用Express+MySQL进行简单的增删改查
前言: 随着JavaScript语言的快速发展,其功能越来越强大,能做的事情也越来越多. 目前,web前端工程师能够利用NodeJS搭建服务,也成为了越来越多互联网公司对前端开发的硬性要求. 本文主要 ...
随机推荐
- Java地位被撼动?Java与JavaScript的趣事连载
第一回 JavaScript的进攻 公元2014年,Java 第八代国王终于登上了王位. 第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力. 德高望重的IO大臣颤悠悠地走 ...
- Java基础——多线程(持续更新中)
如何建立一个执行路径呢? 通过查询API文档 java.lang.Thread类 该类的描述中有创建线程的两种方式 1.继承Thread类 (1).将类声明为 Thread 的子类 (2).该子类应重 ...
- 在macos上基于python2.7安装PyQt5
在python3上面安装PyQt5是十分简单的,可是,在python2.7上安装这个东西,着实让人折腾了一把.要总结一下,年纪大了,记性不好. 首先要安装最新版的Qt和python2,命令如下: br ...
- Python + PyQt5 实现美剧爬虫可视工具
美剧<权力的游戏>终于要开播最后一季了,作为马丁老爷子的忠实粉丝,为了能够看得懂第八季复杂庞大的剧情架构,本人想着将前几季再稳固一下,所以就上美剧天堂下载来看,可是每次都上去下载太麻烦了, ...
- javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)
接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...
- 用消息队列和socket实现聊天系统
前言:最近在学进程间通信,所以做了一个小项目练习一下.主要用消息队列和socket(UDP)实现这个系统,并数据库存储数据,对C语言操作不熟悉的可以参照我的这篇博客:https://www.cnblo ...
- JavaScript夯实基础系列(四):原型
在JavaScript中有六种数据类型:number.string.boolean.null.undefined以及对象,ES6加入了一种新的数据类型symbol.其中对象称为引用类型,其他数据类 ...
- 强化学习(十)Double DQN (DDQN)
在强化学习(九)Deep Q-Learning进阶之Nature DQN中,我们讨论了Nature DQN的算法流程,它通过使用两个相同的神经网络,以解决数据样本和网络训练之前的相关性.但是还是有其他 ...
- Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)
不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...
- C#的Lock
有时候在编写线程并发的时候需要考虑异步和同步的问题.有些资源只能是一个线程访问,其他的线程在这个线程没有释放资源前不能访问.类似于操作系统中临界资源的访问.C#Lock包裹的代码块具有原子操作的特性( ...