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;