Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关闭节点中的MSSQL连接_Javascript_Node.js_Sql Server - Fatal编程技术网

Javascript 关闭节点中的MSSQL连接

Javascript 关闭节点中的MSSQL连接,javascript,node.js,sql-server,Javascript,Node.js,Sql Server,我正在使用Electron应用程序中的节点连接SQL Server。 我无法创建RESTAPI 它工作正常,但我有顾虑: 它不会在查询后关闭SQL连接 它为每个查询建立一个新的数据库连接 可以吗? 工作原理: app.js进行2次查询并记录结果 sql.js连接数据库 // app.js const { getUser, getUsers } = require('./sql'); getUser(10).then((result) => { console.dir(resu

我正在使用Electron应用程序中的节点连接SQL Server。
我无法创建RESTAPI

它工作正常,但我有顾虑:

  • 它不会在查询后关闭SQL连接
  • 它为每个查询建立一个新的数据库连接
可以吗?

工作原理:
app.js
进行2次查询并记录结果
sql.js
连接数据库

// app.js
const { getUser, getUsers } = require('./sql');

getUser(10).then((result) => {
    console.dir(result);
});

getUsers.then((result) => {
    console.dir(result);
})

// sql.js
const sql = require("mssql");

// DB credentials
const config = {
    user: 'myuser',
    password: '123',
    server: 'myserver',
    database: 'mydb',
    options: {
        encrypt: true
    }
}

// Creates new connection pool for each query
function connectDB() {
    const pool = new sql.ConnectionPool(config);

    return pool.connect()
        .then(pool => {
            console.log('Connected to database');

            // returns Promise
            return pool;
        })
        .catch(err => console.log('Database connection failed!', err));
}

// 1st query
function getUser(id) {
    const connection = connectDB();

    return connection
        .then(pool => {
            return pool.request()
                .input('PK_ID', sql.Int, parseInt(id))
                .execute('[uspGetUser]');
        })
        .then(result => {
            return result.recordset[0];
        })
        .catch(err => {
            console.log('Query failed!', err);
        });
}

// 2nd query
function getUsers() {
    const DB = connectDB();

    return DB
        .then(pool => {
            return pool.request()
                .execute('[uspGetUsers]');
        })
        .then(result => {
            return result.recordset[0];
        })
        .catch(err => {
            console.log('Query failed!', err);
        });
}

module.exports = {
    getUser,
    getUsers
}
解决了

要关闭数据库连接并返回结果,我们可以使用finally语句和asnyc/await函数

finally语句允许您在try和catch之后执行代码,而不管结果如何

// sql.js
const sql = require("mssql");

// DB credentials
const config = {
    user: 'myuser',
    password: '123',
    server: 'myserver',
    database: 'mydb',
    options: {
        encrypt: true
    }
}

async function connectDB() {
    const pool = new sql.ConnectionPool(config);

    try {
        await pool.connect();
        console.log('Connected to database');

        return pool;
    }
    catch(err) {
        console.log('Database connection failed!', err);

        return err;
    }
}

async function getAll() {
    const DB = await connectDB();

    try {
        const result = await DB.request()
            .query('select * from [your_table]');

        return result.recordset;
    }
    catch (err) {
        console.log('Error querying database', err);

        return err;
    }
    finally {
        DB.close();
    }
}

async function execute() {
    let result = await getAll();
    console.dir(JSON.stringify(result));

    return result;
}

execute();

不,您不需要在每次查询后
关闭
a.k.a.
释放
到连接池的连接。图书馆已经为你做了

pool.close()
方法将关闭池中的所有连接。从技术上讲,您应该只在终止应用程序时才这样做,而不是在每次查询之后,因为每次创建一个新池都会给应用程序带来相当大的开销


我自己也有同样的问题,所以我查阅了项目的。

我可以用
newpromise
resolve
结果包装查询,然后关闭连接。它是有效的(但这是最好的方法吗?),我们如何保持一个db连接的活力。而不是为每个请求创建连接