小弟现在的程序用的mssql,之前就是因为数据库连接问题导致程序堵塞。换了mssql之后好了,但是现在用户量上来了。发现只要中午高峰期,cpu马上100%,连不上数据库,卡死。希望大佬们能帮忙看看,或者能提供一下比较好的mssql连接方式。求求,砰砰砰!!!.磕头感谢
const mssql = require('mssql');
const config = require("./config.js");
function query(sql, callBack) {
try {
const pool = new mssql.ConnectionPool(config, function (err) {
if (err) {
console.log(err);
pool.close()
return;
}
var ps = new mssql.PreparedStatement(pool);
ps.prepare(sql, function (err) {
if (err) {
console.log('sql', sql)
console.log(err);
pool.close()
return;
}
ps.execute('', function (err, result) {
if (err) {
console.log('sql', sql)
console.log('SQL ERRORexecute',err);
pool.close()
return;
}
ps.unprepare(function (err) {
if (err) {
console.log('sql', sql)
console.log(err);
pool.close()
callback(err, null);
return;
}
pool.close()
callBack(err, result);
});
});
});
});
} catch (error) {
console.log('SQL ERROR', error)
}
};
module.exports = query
大家可以发现,我每个请求都会 new mssql.ConnectionPool ,是因为我发现这个写在函数外面会报数据库没有连接。
没有使用个mssql这个库,一下内容纯属个人基于mysql的理解上的看法 这里的ConnectionPool应该是一个链接池管理的的方法,链接池能解决每次sql操作都需要新建链接的问题,但是在这里的用法却是每一次query都调用ConnectionPool,没有发挥出链接池的作用。 这里想要使用链接池的话,应该在全局定义一个pool,在应用启动的时候进行初始化,这样每次需要执行sql操作的时候从pool中取出一个链接来进行sql操作,这样才能避免每次sql操作都要重新建立连接(这个操作是很耗时的)。具体的可以参考官方的说明:https://www.npmjs.com/package/mssql#connection-pools。 写在函数外面会报数据库没有连接的问题应该是你没有await pool1.connect()就直接使用导致的,pool初始化也是需要时间的(这是一个异步操作)。 如果使用的是TS的话,推荐一个库:typeorm。
@dingyuanwu 好的,感谢