|
|
@@ -1,138 +1,90 @@
|
|
|
-//参数
|
|
|
-var us = {
|
|
|
+var us = {
|
|
|
mysql: require('mysql'),
|
|
|
sqle: {}
|
|
|
};
|
|
|
|
|
|
-//连接数据库
|
|
|
us.mysqlconnection = function (host, database) {
|
|
|
- if (!us.sqle[host] || !us.sqle[host][database]) { //配置数据库连接
|
|
|
- let port = host == '172.16.12.7' ? 3306 : 3306;
|
|
|
- if (host == '123.58.32.152') {
|
|
|
- port = 20330;
|
|
|
- } else if (host == '183.36.25.92' || host == '183.36.26.8') {
|
|
|
- port = 20007;
|
|
|
- }
|
|
|
- // let port = host == '123.58.32.152' ? 20330 : 20007;
|
|
|
+ if (!us.sqle[host] || !us.sqle[host][database]) {
|
|
|
+ let port = 3306;
|
|
|
+ if (host == '123.58.32.152') port = 20330;
|
|
|
+ else if (host == '183.36.25.92' || host == '183.36.26.8') port = 20007;
|
|
|
+
|
|
|
us.sqle[host] = us.sqle[host] || {};
|
|
|
us.sqle[host][database] = us.mysql.createPool({
|
|
|
- // connectionLimit: 100000,
|
|
|
- queueLimit: 100000,
|
|
|
- host: host, //数据库地址
|
|
|
- // host: '123.58.32.151', //数据库地址
|
|
|
- user: "root", //用户名
|
|
|
- password: host == '127.0.0.1' ? "root" : "cocorobo", //密码
|
|
|
+ connectionLimit: 10, // ★ 必须明确设置,建议 10~20
|
|
|
+ queueLimit: 0, // 0 = 不限制排队(默认)
|
|
|
+ acquireTimeout: 10000, // 取连接超时
|
|
|
+ waitForConnections: true,
|
|
|
+ host: host,
|
|
|
+ user: "root",
|
|
|
+ password: host == '127.0.0.1' ? "root" : "cocorobo",
|
|
|
charset: 'utf8mb4_general_ci',
|
|
|
- database: database, //数据库名称
|
|
|
- // port: 20007 //端口
|
|
|
- port: port, //端口
|
|
|
- }); //连接超时和错误从连
|
|
|
+ database: database,
|
|
|
+ port: port,
|
|
|
+ connectTimeout: 10000,
|
|
|
+ // 长连接保活,防止被 MySQL/中间件掐断后残留死连接
|
|
|
+ enableKeepAlive: true,
|
|
|
+ keepAliveInitialDelay: 10000
|
|
|
+ });
|
|
|
}
|
|
|
- //connectionLimit: 1000,
|
|
|
- return us.sqle[host][database]; //返回连接对象
|
|
|
-}
|
|
|
-
|
|
|
+ return us.sqle[host][database];
|
|
|
+};
|
|
|
|
|
|
-//连接数据库调用
|
|
|
+// ★ 用 pool.query() 替代 getConnection+query+release
|
|
|
exports.usselect = function (param, callback) {
|
|
|
- if (param.length > 1) {
|
|
|
- var _mysqlconnection = us.mysqlconnection(param[0], param[1]); //创建连接池
|
|
|
- _mysqlconnection.getConnection(function (error, connection) { //获取连接
|
|
|
- if (error) { //连接错误
|
|
|
- console.log("连接失败:", error);
|
|
|
- callback(error);
|
|
|
- } else { //连接成功
|
|
|
- try {
|
|
|
- for (i = 0; i < param.length; i++) {
|
|
|
- param[i] = decodeURIComponent(param[i]);
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.log("decodeURIComponent 失败:", e);
|
|
|
- connection.release(function (error) { //释放资源
|
|
|
- if (error) {
|
|
|
- console.log("连接释放错误", error)
|
|
|
- };
|
|
|
- });
|
|
|
- callback(e);
|
|
|
- return;
|
|
|
- } //格式化处理参数
|
|
|
- var i, _sql = "CALL ";
|
|
|
- var _param = new Array();
|
|
|
- if (param.length > 3) { //带有参数的sql语句 如:'call test(?, ?, ?);'
|
|
|
- _param = param.slice(3) //截取有效参数
|
|
|
- _sql += (param[2] || "") + "(?"; //拼接存储过程名称
|
|
|
- //_s += (p[2] || "") + "('" + p.slice(3).join("','") + "');";
|
|
|
- //, + ? 拼接参数 该方法拼接后比数组长度少一因此上一句代码中默认拼接了第一个参数
|
|
|
- _sql += Array(_param.length).join(",?");
|
|
|
- _sql += ");"; //拼接结果语句
|
|
|
- } else { //不带参数的sql语句 如:'call test();'
|
|
|
- _sql += param[2] + "();";
|
|
|
- }
|
|
|
- // console.log("拼凑的MySQl语句为:", _sql);
|
|
|
- connection.query(_sql, _param, function (error, results, fields) { //执行sql语句
|
|
|
- if (results) {
|
|
|
- // if (results.pop) {
|
|
|
- // results.pop();
|
|
|
- // }
|
|
|
- //console.log(JSON.stringify(results)); 输出结果集
|
|
|
- //执行回调函数
|
|
|
- //results.affectedRows != null 如果受影响行不等于null(空) 则返回受影响行数
|
|
|
- //results.affectedRows != null 如果受影响行不等于null(空) 则返回受影响行数
|
|
|
- //results.length > 1 ? results : results[0] 如果结果集为单行则直接返回Object对象 否则返回数组对象
|
|
|
- callback(results.affectedRows != null ? results.affectedRows : results.length > 1 ? results : results[0]);
|
|
|
- } else { //执行错误
|
|
|
- console.log("sql执行失败", error || "");
|
|
|
- callback(error);
|
|
|
- }
|
|
|
- });
|
|
|
+ if (param.length <= 1) return callback(new Error('param invalid'));
|
|
|
|
|
|
- connection.release(function (error) { //释放资源
|
|
|
- if (error) {
|
|
|
- console.log("连接释放错误", error)
|
|
|
- callback(error);
|
|
|
- };
|
|
|
- });
|
|
|
+ var pool = us.mysqlconnection(param[0], param[1]);
|
|
|
|
|
|
- }
|
|
|
- });
|
|
|
+ // 参数解码
|
|
|
+ try {
|
|
|
+ for (var i = 0; i < param.length; i++) {
|
|
|
+ param[i] = decodeURIComponent(param[i]);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log("decodeURIComponent 失败:", e);
|
|
|
+ return callback(e);
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
+ var _sql = "CALL ";
|
|
|
+ var _param = [];
|
|
|
+ if (param.length > 3) {
|
|
|
+ _param = param.slice(3);
|
|
|
+ _sql += (param[2] || "") + "(?";
|
|
|
+ _sql += Array(_param.length).join(",?");
|
|
|
+ _sql += ");";
|
|
|
+ } else {
|
|
|
+ _sql += param[2] + "();";
|
|
|
+ }
|
|
|
+
|
|
|
+ pool.query(_sql, _param, function (error, results) {
|
|
|
+ if (error) {
|
|
|
+ console.log("sql执行失败", error);
|
|
|
+ return callback(error);
|
|
|
+ }
|
|
|
+ callback(results.affectedRows != null
|
|
|
+ ? results.affectedRows
|
|
|
+ : results.length > 1 ? results : results[0]);
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
-//直接执行SQL语句
|
|
|
-//参数格式:[host, database, sql, ...params] sql 为带占位符的原生 SQL,params 为对应参数
|
|
|
exports.usquery = function (param, callback) {
|
|
|
- if (param.length > 2) {
|
|
|
- var _mysqlconnection = us.mysqlconnection(param[0], param[1]); //创建连接池
|
|
|
- _mysqlconnection.getConnection(function (error, connection) { //获取连接
|
|
|
- if (error) { //连接错误
|
|
|
- console.log("连接失败:", error);
|
|
|
- callback(error);
|
|
|
- } else { //连接成功
|
|
|
- var _sql = param[2]; //原生 SQL 语句
|
|
|
- var _param = param.length > 3 ? param.slice(3) : []; //SQL 参数
|
|
|
- connection.query(_sql, _param, function (error, results, fields) { //执行sql语句
|
|
|
- if (results) {
|
|
|
- //results.affectedRows != null 如果受影响行不等于null(空) 则返回受影响行数
|
|
|
- //results.length > 1 ? results : results[0] 如果结果集为单行则直接返回Object对象 否则返回数组对象
|
|
|
- callback(results.affectedRows != null ? results.affectedRows : results.length > 1 ? results : results[0]);
|
|
|
- } else { //执行错误
|
|
|
- console.log("sql执行失败", error || "");
|
|
|
- callback(error);
|
|
|
- }
|
|
|
- });
|
|
|
+ if (param.length <= 2) return callback(new Error('param invalid'));
|
|
|
|
|
|
- connection.release(function (error) { //释放资源
|
|
|
- if (error) {
|
|
|
- console.log("连接释放错误", error)
|
|
|
- callback(error);
|
|
|
- };
|
|
|
- });
|
|
|
+ var pool = us.mysqlconnection(param[0], param[1]);
|
|
|
+ var _sql = param[2];
|
|
|
+ var _param = param.length > 3 ? param.slice(3) : [];
|
|
|
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-}
|
|
|
+ pool.query(_sql, _param, function (error, results) {
|
|
|
+ if (error) {
|
|
|
+ console.log("sql执行失败", error);
|
|
|
+ return callback(error);
|
|
|
+ }
|
|
|
+ callback(results.affectedRows != null
|
|
|
+ ? results.affectedRows
|
|
|
+ : results.length > 1 ? results : results[0]);
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
|
|
|
//重新连接处理
|