@mysql/xdevapi ECONNREFUSED没有't释放连接



我使用的是@mysql/xdevapi-npm包(版本8.0.22(,本地安装的是mysql-8.0.15-winx64。

我已将池设置为已启用,并尝试从客户端检索会话。如果我在mysql准备好之前这样做,那么我会得到一个预期的ECONNREFUSED异常,但连接似乎从未被释放。如果池大小为1,则所有后续尝试获取会话

异常是从getSession方法中抛出的,因此不会返回会话以便我手动调用.end()

const mysqlx = require('@mysql/xdevapi');
const client = mysqlx.getClient(config, { pooling: { enabled: true, maxSize: 1, queueTimeout: 2000 } });
const session = await this.client.getSession(); // returns ECONNREFUSED exception
/*
wait for mysql to be ready and accepting connections
*/
const session = await this.client.getSession(); // returns connection pool queue timeout exception because the previous session hasn't been returned to the pool

如何确保中止的连接返回到池?

这是一个错误,我鼓励您在https://bugs.mysql.com/使用CCD_ 2类别。

如果getSession()方法返回一个被拒绝的Promise(有或没有特定错误(,那么想到的唯一解决方法就是重新创建池。例如:

const poolConfig = { pooling: { enabled: true, maxSize: 1, queueTimeout: 2000 } }
let pool = mysqlx.getClient(config, poolConfig)
let session = null
try {
session = await pool.getSession()
} catch (err) {
await pool.close()
pool = mysqlx.getClient(config, poolConfig)
session = await pool.getSession()
// do something
}

这是一个丑陋的解决方案,可能很难硬塞进你的设计中,但至少,它可以让你享受连接池的其他好处。

免责声明:我是Node.js 的MySQL X DevAPI连接器的首席开发人员

相关内容

  • 没有找到相关文章

最新更新