zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【node】express中mysql的基本用法、连接池的使用、事务的回滚

2023-03-14 22:37:36 时间

安装mysql包


npm install mysql --save

mysql的配置信息


//  数据库配置文件
var mysql = require('mysql');
const config = {
    host : 'localhost',
    database : 'wish',
    username : 'root',
    password : '123'
}

var connection = mysql.createConnection({
    host: config.host, //数据库地址
    user: config.username,//用户名
    password: config.password,//密码
    database: config.database,//数据库名称
    timezone:'+08:00'
});

module.exports = connection;

mysql基本操作


mysql的基本操作即为:读、写两个操作。读操作用SELECT关键字查询出结果之后,返回给html页面渲染数据。写操作是html页面的< form>标签提交的数据,写入mysql数据库。

查询mysql并渲染数据


// 设置‘/’的路由
router.get('/',function getList(req,res){
    var sql = 'SELECT * FROM wish';
        Connection.query(sql, function(err, result) {
        if (err) {
            console.log('[SELECT 错误]:', Constant.DEFAULT_ERROR);
        }
        // 为index页面的data变量,赋值为查询结果result
        // 之后前端会渲染数据
        res.render('index',{
            data:result
        })
    })
});

mysql插入操作


插入操作需要借助< form >标签,提示点击提交之后,会跳转到另外一个页面,还是没有ajax方便。

首先在html页面写上< form >标签


<form action="add" method="post" id="form">
    <input name="name">
    <input name="content">
    <button type="submit">提交</button>
</form> 

点击submit按钮之后,提交的路由就是‘/add’,在服务器端获取的request.body中会包含name、content参数值。

开始插入


router.post('/add',function add(req,res){
    if(req.body.name==''&&req.body.content==''){
        console.log('不可为空');
    }
    var sql = `INSERT INTO wish VALUES('112','${req.body.name}','${req.body.content}','1','')`;
    Connection.query(sql, function(err, result) {
        if (err) {
            console.log('[SELECT 错误]:', Constant.DEFAULT_ERROR);
        } 
        //这里理因写个跳转页面
    })
});

mysql连接池


为什么要采用数据库连接池


此处引用了知乎用户:Drol的回答

应用程序和数据库建立连接的过程是这样的:

1、首先通过TCP协议的三次握手和数据库服务器建立连接,然后发送数据库用户账号密码,等待数据库验证用户身份。


2、 完成用户身份验证后,系统才可以提交SQL语句到数据库执行。


3、 好了这个时候假设我们不使用数据库连接池,那么完成一次SQL查询后,我们还要把连接关闭,关闭连接就需要和数据库通信告诉它我们要断开连接了然后再TCP四次挥手最后完成关闭。


这个过程中每一次发起SQL查询所经历的TCP建立连接,数据库验证用户身份,数据库用户登出,TCP断开连接消耗的等待时间都是可以避免的,这明显是一种浪费。打个比方,你去网吧去玩游戏,每次去到呢先插网线,然后开机登录游戏,玩了一会儿要去上厕所,你就退出游戏,然后关机拔网线。去完厕所回来就又重新插网线开机登游戏。


有没有觉得上面例子中的行为很扯蛋,所以每次SQL查询都创建链接,查询完后又关闭连接这个做法本身就很扯蛋。合理的做法就应该是系统启动的时候就创建数据库连接,然后需要使用SQL查询的时候,就从系统拿出数据库连接对象并提交查询,查询完了就把连接对象还给系统。系统在整个程序运行结束的时候再把数据库连接关闭。考虑到一般数据库应用都是Web多用户并发应用,那么只有一个数据库连接对象肯定不够用,所以系统启动的时候就应该多创建几个数据库连接对象供多个线程使用,这一批数据库连接对象集合在一起就被称之为数据库连接池。


数据库连接池就是典型的用空间换时间的思想,系统启动预先创建多个数据库连接对象虽然会占用一定的内存空间,但是可以省去后面每次SQL查询时创建连接和关闭连接消耗的时间。

以空间换空间,避免多次TCP/IP的三次握手与四次挥手。

node中mysql数据库连接池的写法


var mysql = require('mysql');
var pool = mysql.createPool({
    host : "hostName",
    user : "username",
    password: "password"
});

pool.getConnection(function(err, connection){
    connection.query( "select * from table1", function(err, rows){
        if(err) {
            throw err;
        }else{
            console.log( rows );
        }
    });
    connection.release();
});

mysql事务


事务的应用场景主要针对多条SQL语句同时操作,其中某一条语句发生错误,那么数据库应回到之前所有语句还未操作的状态。成为事务的回滚。