diff --git a/lib/base/pool.js b/lib/base/pool.js index 47981f1943..3086f0d8b2 100644 --- a/lib/base/pool.js +++ b/lib/base/pool.js @@ -121,7 +121,7 @@ class BasePool extends EventEmitter { } for (let i = 0; i < this._allConnections.length; i++) { connection = this._allConnections.get(i); - connection._realEnd(endCB); + connection.end(endCB); } } @@ -200,7 +200,7 @@ class BasePool extends EventEmitter { Date.now() - this._freeConnections.get(0).lastActiveTime > this.config.idleTimeout) ) { - this._freeConnections.get(0).destroy(); + this._freeConnections.get(0).end(); } } finally { this._removeIdleTimeoutConnections(); diff --git a/lib/base/pool_connection.js b/lib/base/pool_connection.js index 74511ce587..5bba18a449 100644 --- a/lib/base/pool_connection.js +++ b/lib/base/pool_connection.js @@ -29,16 +29,9 @@ class BasePoolConnection extends BaseConnection { this._pool.releaseConnection(this); } - end() { - const err = new Error( - 'Calling conn.end() to release a pooled connection is ' + - 'deprecated. In next version calling conn.end() will be ' + - 'restored to default conn.end() behavior. Use ' + - 'conn.release() instead.', - ); - this.emit('warn', err); - console.warn(err.message); - this.release(); + end(callback) { + this._removeFromPool(); + super.end(callback); } destroy() { @@ -58,6 +51,3 @@ class BasePoolConnection extends BaseConnection { BasePoolConnection.statementKey = BaseConnection.statementKey; module.exports = BasePoolConnection; - -// TODO: Remove this when we are removing PoolConnection#end -BasePoolConnection.prototype._realEnd = BaseConnection.prototype.end; diff --git a/test/test-pool-releases-connections-gracefully.test.cjs b/test/test-pool-releases-connections-gracefully.test.cjs new file mode 100644 index 0000000000..2d5845d747 --- /dev/null +++ b/test/test-pool-releases-connections-gracefully.test.cjs @@ -0,0 +1,41 @@ +'use strict'; +const createPool = require('../common.test.cjs').createPool; +const { assert } = require('poku'); + +/** + * This test case tests that the pool releases connections gracefully after the idle timeout has passed. + * + * @see https://github.com/sidorares/node-mysql2/issues/3148 + */ + +const pool = new createPool({ + connectionLimit: 3, + maxIdle: 2, + idleTimeout: 1000, +}); + +let connection1Ended = false; +let connection2Ended = false; +let connection3Ended = false; + +pool.getConnection((_err1, connection1) => { + pool.getConnection((_err2, connection2) => { + pool.getConnection((_err3, connection3) => { + connection1.stream.on('end', () => (connection1Ended = true)); + connection2.stream.on('end', () => (connection2Ended = true)); + connection3.stream.on('end', () => (connection3Ended = true)); + + connection1.release(); + connection2.release(); + connection3.release(); + + setTimeout(() => { + assert(connection1Ended, 'connection1 should have ended'); + assert(connection2Ended, 'connection2 should have ended'); + assert(connection3Ended, 'connection3 should have ended'); + + pool.end(); + }, 2000); + }); + }); +});