我正在使用以下代码进行knex连接,但经常发生错误
Knex:超时获取连接。游泳池可能已满。您是否缺少.transacting(trx)通话?
谁能为这个问题提出解决方案?
var knexConn = reqKnex({
client: pClient,
native: false,
connection: pConn,
searchPath: pSearchPath,
pool: {
max: 7,
min: 3,
acquireTimeout: 60 * 1000
}
});
function getTransactionScope(pKnex, callback) {
try {
pKnex.transaction(function(trx) {
return callback(trx);
});
} catch (error) {
console.log(error);
}
}
function ExecuteSQLQuery(pTranDB, pTrx, pQuery, pCallback) {
try {
var query = pTranDB.raw(pQuery);
if (pTrx) {
query = query.transacting(pTrx);
}
query.then(function(res, error) {
try {
if (error) {
console.log(error);
} else {
return pCallback(res, error);
}
} catch (error) {
console.log(error);
}
}).catch(function(error) {
return pCallback(null, error);
});
} catch (error) {
console.log(error);
}
}
function Commit(pTrx, pIsCommit) {
try {
if (pIsCommit) {
pTrx.commit();
} else {
pTrx.rollback();
}
} catch (error) {
console.log(error);
}
}
Run Code Online (Sandbox Code Playgroud)
Bra*_*vic 31
我用这些版本解决了这个问题:
"knex": "^0.21.1",
"objection": "^2.1.3",
"pg": "^8.0.3"
Run Code Online (Sandbox Code Playgroud)
小智 14
我最近有这个问题,我刚刚更新到 Node v14.2.0
此版本似乎对 knex 进行了重大更改。幸运的是我有 NVM,所以我切换到另一个版本(v12.16.3),这解决了这个问题。
祝你好运!
我做了一些测试。这是结果。
"knex": "^0.20.8",
"objection": "^2.1.2",
"pg": "^7.14.0"
Run Code Online (Sandbox Code Playgroud)
使用这些版本,我的应用程序在节点上运行良好12.22.7,但我在14.18.1.
更新pg到版本8.0.2:
12.22.7-> 它工作正常14.18.1-> knex 超时错误更新pg到版本8.0.3:
12.22.7-> 它工作正常14.18.1-> 它工作正常14当pg版本为 时,该问题在节点上消失8.0.3。
属性propagateCreateError应该设置为false以防止超时获取连接。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?错误。
池配置示例:
"pool": {
"min": 2,
"max": 6,
"createTimeoutMillis": 3000,
"acquireTimeoutMillis": 30000,
"idleTimeoutMillis": 30000,
"reapIntervalMillis": 1000,
"createRetryIntervalMillis": 100,
"propagateCreateError": false // <- default is true, set to false
},
Run Code Online (Sandbox Code Playgroud)
说明:在 Knex 中, propagateCreateError默认设置为 true,如果第一次创建数据库连接失败,则会抛出TimeoutError,从而阻止 tarn(连接池管理器)自动重新连接。
解决方案是将propagateCreateError设置为 false,从而使knex在创建连接失败时自动重新连接,而不是抛出错误。
AuroraDB:如果您连接到 AuroraDB 实例,目前它的启动时间很长,导致每次新的冷启动时出现 TimeoutError,要解决此问题,请设置 AWS Console -> RDS -> AuroraDB Instance -> Pausecomputecapacity连续几分钟不活动后:1440 小时,以防止数据库完全进入睡眠状态。
详细说明请参见 https://github.com/knex/knex/issues/2820
将 Strapi 应用程序部署到 heroku 时,我遇到了同样的问题。在我的 package.json 中,我有以下版本:
"knex": "<0.20.0""pg": "^7.18.2"我还有以下节点引擎配置:
"engines": {
"node": ">=10.0.0",
"npm": ">=6.0.0"
},
Run Code Online (Sandbox Code Playgroud)
将版本更改为<0.21.1和^8.0.3(如此处建议:https : //stackoverflow.com/a/61482183/4696783)并将节点引擎更改为12.16.x(如此处建议:https : //stackoverflow.com/a/61942001/4696783)解决了问题。
Tod*_*ski -3
我有同样的问题,考虑到: 这篇文章。
属性propagateCreateError应该设置为false以防止超时获取连接。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?错误。
池配置示例:
“池”:{“分钟”:2,“最大”:6,“createTimeoutMillis”:3000,“acquireTimeoutMillis”:30000,“idleTimeoutMillis”:30000,“reapIntervalMillis”:1000,“createRetryIntervalMillis”:100,“propagateCreateError” : false // <- 默认为 true,设置为 false },说明:
在 Knex 中,propagateCreateError 默认设置为 true,如果第一次创建数据库连接失败,则会抛出 TimeoutError,从而阻止 tarn(连接池管理器)自动重新连接。
解决方案是将propagateCreateError 设置为 false,从而使 knex 在创建连接失败时自动重新连接,而不是抛出错误。
和这篇文章:
我做了以下配置
module.exports = {
client: 'pg',
connection: {
host: config.testDB.host,
user: config.testDB.userName,
port: config.testDB.port,
password: config.testDB.password,
database: 'testdb',
charset: 'utf8'
},
pool: {
max: 50,
min: 2,
// acquireTimeout: 60 * 1000,
// createTimeoutMillis: 30000,
// acquireTimeoutMillis: 30000,
// idleTimeoutMillis: 30000,
// reapIntervalMillis: 1000,
// createRetryIntervalMillis: 100,
propagateCreateError: false // <- default is true, set to false
},
migrations: {
tableName: 'knex_migrations'
}
}
Run Code Online (Sandbox Code Playgroud)
如果它不适合您,请尝试将propagateError设置为true并取消注释
"idleTimeoutMillis": 30000,
"createTimeoutMillis": 30000,
"acquireTimeoutMillis": 30000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5250 次 |
| 最近记录: |