zoukankan      html  css  js  c++  java
  • nodejs 连接mysql 集群,开启事务,事务回滚封装

    mysql.js
    
    
    
    const mysql = require("mysql");
    const poolCluster = mysql.createPoolCluster({
        removeNodeErrorCount: 1, // Remove the node immediately when connection fails.
        defaultSelector: "RR" //RR,RANDOM,ORDER
    });
    const mysqlNodes = {
            node1: {
                host: "mysql_host",
                port: 3306,
                user: "root",
                password: "mysql_password",
                database: "my_test_database",
                charset: "utf8",
                waitForConnections: true,
                connectionLimit: 10,
                queueLimit: 0
            },
            node2: {
                host: "mysql_host",
                port: 3306,
                user: "root",
                password: "mysql_password",
                database: "my_test_database",
                charset: "utf8",
                waitForConnections: true,
                connectionLimit: 10,
                queueLimit: 0
            },
            node3: {
                host: "mysql_host",
                port: 3306,
                user: "root",
                password: "mysql_password",
                database: "my_test_database",
                charset: "utf8",
                waitForConnections: true,
                connectionLimit: 10,
                queueLimit: 0
            }
    };
    for (let node in mysqlNodes) {
        poolCluster.add(`${node}`, mysqlNodes[`${node}`]);
    }
    
    class MysqlModel {
        /**
         * 实例化mysql
         */
        getConnection() {
            return new Promise((resolve, reject) => {
                poolCluster.getConnection(function (err, connection) {
                    if (err) {
                        reject(err);
                    } else {
                       console.log(60, 'mysql连接成功')
                        resolve([
                            connection,
                            poolCluster
                        ]);
                    }
                })
            })
        }
    
    }
    
    async function mysqlDBUtil() {
        try {
            const db = new MysqlModel();
            const [conn, pool] = await db.getConnection();
            /**
             * 回滚事务
             */
            const rollback = async function () {
                conn.rollback();
                console.log('mysql事务发生回滚......rollback')
            }
    
            /**
             * 数据库操作
             * @param {} sql
             * @param {*} options
             */
            const query = function (sql, options) {
                return new Promise((resolve, reject) => {
                    conn.query(sql, options, function (error, results, fields) {
                        if (error) {
                            reject(error);
                        } else {
                            resolve(results);
                        }
                    })
                })
            }
    
            /**
             *提交事务
             */
            const commit = function () {
                return new Promise((resolve, reject) => {
                    conn.commit(function (err) {
                        if (err) {
                            reject(err);
                        }else{
                            console.log('mysql事务提交......commit')
                            resolve(true);
                        }
                    });
                })
            }
            /**
             * 关闭连接池,mysql2的包自己不会释放
             */
            const close = async function () {
                conn.release();
                console.log('mysql连接池释放.....release');
            }
            return {
                rollback,
                commit,
                close,
                query
            }
        } catch (error) {
            throw error;
        }
    }
    module.exports = mysqlDBUtil;
    
    //调用
    var express = require("express");
    var router = express.Router();
    const mysqlUtil = require("../mysql");
    /*
     * 可以在MYSQL中执行show status like 'Threads%',查看连接数
    */
    router.get("/", async function (req, res, next) {
      for (let i = 0; i < 5000; i++) {
        const db = await mysqlUtil();
        const sql = "select * from user limit 0,100";
        const result = await db.query(sql);
        await db.close();
        console.log(i, result)
      }
      res.send('ok');
    });
    
    module.exports = router;
      
    
     
    

      

  • 相关阅读:
    CSS基础(二十五)--Background背景之让background-image失效
    CSS基础(二十四)--Background背景之background-image平铺图片堆叠显示
    CSS基础(二十三)--Hover鼠标悬浮变色
    Nginx_安全1
    firewalld防火墙
    shell编程习题
    linux忘记密码
    sed和awk详解
    shell正则表达式
    ssh
  • 原文地址:https://www.cnblogs.com/qiyc/p/12148009.html
Copyright © 2011-2022 走看看