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 枚举类详解
1. 枚举类定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类. 2. 早期实现枚举的方式 public static f ...
- MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
开发背景: 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性 ...
- IDEA:Maven项目找不到mapper文件 无法自动映射
如果你发现所有的功能都报找不到映射的错,有可能是因为mapper文件没有被编译 在eclipse中,把资源文件放在src下,是可以被编译的 但是在idea中,直接把资源文件放在src下,如果不进行设置 ...
- 跟我一起学opencv 第一课之图像加载,修改,保存
使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...
- 机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义
0.随机森林的思考 随机森林的决策树是分别采样建立的,各个决策树之间是相对独立的.那么,在我们得到了第k-1棵决策树之后,能否通过现有的样本和决策树的信息, 对第m颗树的建立产生有益的影响呢?在随机森 ...
- 求解: Windows Phone XAML Controls 为什么是disable状态?
问题 : 我在做一个windows phone 的App,显示一个web 返回来的data,现在想用控件ListView 去绑定这个Data,但是 为何我的VS2012 中的 ToolBox 的XAM ...
- MySQL集群架构:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高性能-技术流ken
MHA简介 MHA可以自动化实现主服务器故障转移,这样就可以快速将从服务器晋级为主服务器(通常在10-30s),而不影响复制的一致性,不需要花钱买更多的新服务器,不会有性能损耗,容易安装,不必更改现有 ...
- python 题库1
1. 生成一个1到50的大字符串,每个数字之间有个空格,例如1 2 3 4 ……50 解题思路: (1)声明一个空字符串变量用于保存生成的字符串 (2)使用for循环+range()函数生成一个1到5 ...
- Flask实战第3天:url_for使用
我们之前是通过url来找到对应的视图函数 / => hello_world 那么url_for则是通过视图函数找到url hello world => / 演示如下 #c ...
- pdf文件下载水印添加的中文与空格问题解决
public static boolean waterMark(String inputFile, String outputFile, String waterMarkName)throws IOE ...