Node.js WEB服务器-使用mssql软件包的饥饿

时间:2019-03-26 20:38:04

标签: node.js sql-server express web

我有一个Web服务器,该服务器接收XML文件并将其存储在SQL Server数据库中。

我正在使用multer中间件来获取文件和MSSQL包以将XML内容保存到数据库中。

我希望每个用户能够一次发送多个文件(一次发送多个文件,例如1000个或更多)。

问题在于,当一个用户发送文件时,它将消耗mssql配置中指定的所有池,如果另一个用户发送了更多文件,它将不得不等到第一个用户完成所有文件的发送。

我希望在所有发送文件的用户之间共享池,以避免饥饿,以便他们可以同时发送文件。

我的mssql配置看起来像这样:

{
    "user": "username",
    "password": "xxxxxx",
    "database": "database_name",
    "server": "host.host",
    "dialect": "mssql",
    "encrypt": true,
    "dialectOptions": {
        "encrypt": true
    },
    "pool": {
        "max": 5,
        "min": 0,
        "idle": 10000,
        "acquire": 40000,
    }
}

我的mssql连接文件:

const mssql = require('mssql');

const pool = new mssql.ConnectionPool(require('config'));

pool.connect(err => {if (err) throw err});

module.exports = pool;

我的控制器文件:

const fs = require('fs');
const async = require('async');
const mssql = require('@mssql');

exports.recive_xml_files = async (req, res) => {

    const files = req.files;
    const empresa = req.body.empresa;
    let cnpj = empresa.split(':')[1];

    async.each(files, (file, callback) => {

        saveXmlDb(file, cnpj).then(() => {

            callback();
        });
    }, (err) => {

        let status = 200;

        if (err) status = 500;

        res.sendStatus(status);
    });

};


const saveXmlDb = (file, cnpj) => {

    return new Promise((resolve, reject) => {

        fs.readFile(file.path, (err, data) => {

            if (err) reject("Não foi possível ler o arquivo XML.");

            let sXml = data.toString();

            mssql.query(`INSERT into Arquivos_XML (Conteudo, Origem_Id) VALUES ('${sXml}', 6)`).then(res => {
                console.log('SAAVING FOR THE FOLLOWING CNPJ------------>', cnpj);
                resolve();
            }).catch(err => {

                reject();
            });


        });
    });
}

有人可以帮助我实现这一目标吗?

谢谢。

0 个答案:

没有答案