mssql数据库连接封装问题
发布于 3 个月前 作者 SKandAV 586 次浏览 来自 问答

小弟现在的程序用的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 ,是因为我发现这个写在函数外面会报数据库没有连接。

2 回复

没有使用个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 好的,感谢

回到顶部