node-mssql icon indicating copy to clipboard operation
node-mssql copied to clipboard

ECONNCLOSED Error with Connection Pool

Open gryphus1153 opened this issue 1 year ago • 4 comments

Connection Pool gives ECONNCLOSED error after random number of days.

Expected behaviour:

Expected Pool to be self healing and recover.

Actual behaviour:

My app creates 2 seperate connection pools to connect to two different Databases on same SQL Server. This will work for a few days buit after some number of days (Unknown number of days, inconsistent) all further queries will fail and not reconnect until the app is restarted.

dbSingleton.js - Class to create connection Pool based on config paramaters

const Sql = require("mssql");

class dbSingleton {
    constructor(config) {
        this.pool = new Sql.ConnectionPool(config);
        this.poolConnect = this.pool.connect().catch((error) => console.log(error));
    }
    async procedureCall(procedure, payload) {
        await this.poolConnect;
        let request = this.pool.request();

        for (const [key, value] of Object.entries(payload)) {
            // Check if datatype is included
            if (Array.isArray(value))
            {
                request.input(key, value[0], value[1])
            }
            else
            {
                request.input(key, value);
            }
        }
        return await request.execute(procedure);
    }
    async getPool() {
        await this.poolConnect;
        return this.pool;
    }
}

module.exports = {
    dbSingleton,
};

Connector.js - Creates new dbSingleton Class with a given config.

const config = require("../config");
const { dbSingleton } = require("./dbSingleton");

const dbConnector = new dbSingleton(config.mssql_config);

module.exports = {
    dbConnector
};

Function Call - Calls a stored procedure with given key-value pairs

const Connector = require('./Connector');
async function procedureCall(procedureName, params) {
    try {
        let res = await Connector.dbConnector.procedureCall(
            procedureName,
            params
        );
        return res;
    } catch (error) {
        // handle error here
        console.log(error);
    }
}

Error Message

ConnectionError: Connection is closed.
    at Request._execute (/src/node_modules/mssql/lib/base/request.js:557:37)
    at Request._execute (/src/node_modules/mssql/lib/tedious/request.js:700:11)
    at /src/node_modules/mssql/lib/base/request.js:519:12
    at new Promise (<anonymous>)
    at Request.execute (/src/node_modules/mssql/lib/base/request.js:518:12)
    at dbSingleton.procedureCall (/src/dbConnectors/dbSingleton.js:25:30)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async procedureCall (/src/workflow.js:518:17)
    at async handler (/src/workflow.js:153:28) {
  code: 'ECONNCLOSED'

Configuration:

"options": {
      "encrypt": true,
      "trustServerCertificate": true
    },
    "requestTimeout": 300000

App is able to successfully connect to SQL Server.

Software versions

  • NodeJS: v14.19.1
  • node-mssql: 6.4.1
  • SQL Server: Microsoft SQL Server 2019

gryphus1153 avatar Jan 20 '23 15:01 gryphus1153