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;