node-mssql
node-mssql copied to clipboard
ECONNCLOSED Error with Connection Pool
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