Закройте соединение MSSQL в Node

Я подключаюсь к SQL Server, используя Node пакет mssql в моем приложении Electron. Я не могу создать 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.info('Connected to database');

            // returns Promise
            return pool;
        })
        .catch(err => console.info('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.info('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.info('Query failed!', err);
        });
}

module.exports = {
    getUser,
    getUsers
}

Я мог бы обернуть запросы результатами new Promise и resolve, а затем закрыть соединение. Это работает (но это лучший способ?).

Ruby Harris 17.09.2018 14:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
4 253
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Решено!

Чтобы закрыть соединение с БД и вернуть результаты, мы можем использовать оператор наконец и функции asnyc / ожидание.

Оператор наконец позволяет выполнять код после попытки и уловить, независимо от результата.

// 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.info('Connected to database');

        return pool;
    }
    catch(err) {
        console.info('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.info('Error querying database', err);

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

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

    return result;
}

execute();

Как мы можем поддерживать одно соединение с БД. Вместо того, чтобы создавать соединение для каждого запроса

souravlahoti 25.03.2019 10:22

Нет, вам не нужно возвращать close a.k.a. release обратно в пул соединений после каждого запроса. Библиотека уже делает это за вас.

Метод pool.close() закроет все соединения в пуле. Технически вы должны делать это только при завершении работы приложения, а не после каждого запроса, поскольку создание нового пула каждый раз создает значительные накладные расходы для вашего приложения.

У меня самого был такой же вопрос, поэтому я поискал исходный код проекта.

Другие вопросы по теме