在节点中关闭MSSQL连接

时间:2018-09-17 12:43:45

标签: javascript node.js sql-server

我正在使用Electron应用程序中的节点mssql package与SQL Server连接。
我无法创建REST API。

尽管我有担心,它仍然可以正常工作

  • 查询后不会关闭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
}

2 个答案:

答案 0 :(得分:1)

否,您不需要在每次查询后closerelease个连接返回到连接池。图书馆已经为您做到了。

pool.close()方法将关闭池中的所有连接。从技术上讲,仅应在终止应用程序时执行此操作,而不要在每次查询后执行此操作,因为每次创建新池都会给应用程序造成相当大的开销。

我自己也有同样的问题,所以我查找了项目的source code

答案 1 :(得分:0)

解决了!

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

最终语句使您可以在尝试捕获后执行代码,而不管结果如何。

// 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();
相关问题