路由完成后不会直接释放 knex 连接(并且连接对象超出范围)



在我的应用程序中,我仅在路由处理期间创建knex连接对象,而不是"在脚本加载时",因为配置在其他地方加载到全局对象(Sails(。

因此,代码看起来有点像:

const knexBuilder = require('knex');
function db() {
if (!!sails && !!sails.config && !!sails.config.datastores && !!sails.config.datastores.default) {
return knexBuilder({
client: 'pg',
connection: sails.config.datastores.default,
})
} else {
throw new Error('sails not initialized, can't load db');
}
}
module.exports = {
getEventDates: async function(req: RequestTy, res: ResponseTy) {
const sess = req.session;
try {   
const dbObject = db();
const dbPromise = dbObject
.select(`ed.${EventDate.schema.event.columnName}`, `ed.${EventDate.schema.start_date.columnName}`)
.from(`public.${EventDate.tableName} as ed`);
const data = await dbPromise;
return res.json(data);
} catch(err) {
console.log(err);
return res.status(500).send('problems');
}
},
}

现在我注意到数据库的连接不断增加。随着时间的推移,连接会慢慢断开,但在我们的应用程序中,这很快就会导致一次连接过多的错误。即使只有几个人(每个打开前端页面的用户每隔几秒钟调用一次上述函数(。

那么,我怎样才能强制 knex 表现良好并在对象超出范围后立即清理并丢弃数据库连接呢?

每次调用创建新的 knex 实例的db()函数时,都会创建新的连接池。这也强制 knex 在每个请求上创建与数据库的新连接,因为它无法使用来自那些废弃的旧 knex 实例的旧打开连接。

db()函数中,您应该首先检查您是否已经创建了一个 knex 实例,如果已经创建,则返回已创建的实例。

基本上,除非连接多个数据库,否则永远不应该在应用程序中创建多个 knex 实例。

最新更新