fix: 云库新增慢查询入口 querySlow(池级超时放宽)
mssql 12.2.0 驱动 request.timeout(请求级)实测不生效,超过池默认 60s 的查询必被掐断。动销分析销量 union 4 来源后全仓窗口需 ~2 分钟, 触发 Timeout: Request failed to complete in 60000ms。 - queryWithCandidateConnection 支持 options.connectRequestTimeoutMs 覆盖候选连接的池级 requestTimeout(池级实测生效) - 新增 querySlow(sqlText, params, options):独立临时连接 + 池级超时 默认 300s(env CLOUD_DB_SLOW_QUERY_TIMEOUT_MS 可调) - 动销分析取数优先走 querySlow(mock 环境无该方法时回退 query)
This commit is contained in:
parent
1d4eecb03c
commit
0a2fe1c3a3
@ -764,7 +764,20 @@ async function connectWithCandidate(candidate) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function queryWithCandidateConnection(candidate, sqlText, params = {}, options = {}) {
|
async function queryWithCandidateConnection(candidate, sqlText, params = {}, options = {}) {
|
||||||
const nextPool = new sql.ConnectionPool(candidate.mssqlConfig);
|
// request.timeout(请求级)在 mssql 12.x 上实测不生效(始终按池配置的默认值掐断),
|
||||||
|
// 慢查询必须通过「池配置级 requestTimeout」放宽,这里允许调用方覆盖候选连接的池级超时。
|
||||||
|
let mssqlConfig = candidate.mssqlConfig;
|
||||||
|
const poolRequestTimeout = parsePositiveInt(options.connectRequestTimeoutMs, 0);
|
||||||
|
if (poolRequestTimeout > 0) {
|
||||||
|
mssqlConfig = {
|
||||||
|
...candidate.mssqlConfig,
|
||||||
|
options: {
|
||||||
|
...candidate.mssqlConfig.options,
|
||||||
|
requestTimeout: poolRequestTimeout,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const nextPool = new sql.ConnectionPool(mssqlConfig);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await nextPool.connect();
|
await nextPool.connect();
|
||||||
@ -1093,6 +1106,28 @@ const queryWithFreshConnection = async (sqlText, params = {}, options = {}) => {
|
|||||||
return [];
|
return [];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 慢查询专用入口:走独立临时连接,池级 requestTimeout 放宽到 SLOW_QUERY_POOL_TIMEOUT_MS。
|
||||||
|
* 背景:mssql 12.x 的 request.timeout(请求级)不生效,超过池默认 60s 的查询必须用
|
||||||
|
* 池配置级 requestTimeout 才能放宽。适用场景:动销分析这类多表大窗口聚合。
|
||||||
|
*/
|
||||||
|
const SLOW_QUERY_POOL_TIMEOUT_MS = parsePositiveInt(
|
||||||
|
process.env.CLOUD_DB_SLOW_QUERY_TIMEOUT_MS,
|
||||||
|
300000
|
||||||
|
);
|
||||||
|
|
||||||
|
const querySlow = async (sqlText, params = {}, options = {}) => {
|
||||||
|
const poolRequestTimeout = parsePositiveInt(
|
||||||
|
options.connectRequestTimeoutMs,
|
||||||
|
SLOW_QUERY_POOL_TIMEOUT_MS
|
||||||
|
);
|
||||||
|
return queryWithFreshConnection(sqlText, params, {
|
||||||
|
...options,
|
||||||
|
connectRequestTimeoutMs: poolRequestTimeout,
|
||||||
|
requestTimeout: poolRequestTimeout,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 测试连接
|
* 测试连接
|
||||||
*/
|
*/
|
||||||
@ -1143,6 +1178,7 @@ const reload = async () => {
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
getPool,
|
getPool,
|
||||||
query,
|
query,
|
||||||
|
querySlow,
|
||||||
queryWithFreshConnection,
|
queryWithFreshConnection,
|
||||||
createPinnedQueryClient,
|
createPinnedQueryClient,
|
||||||
test,
|
test,
|
||||||
|
|||||||
@ -198,7 +198,10 @@ async function fetchPickingBinSkuRows(cloudDb, wmsCoIds, options = {}) {
|
|||||||
HAVING ABS(SUM(CAST(b.binSkuQty AS DECIMAL(18, 2)))) > 0.0001
|
HAVING ABS(SUM(CAST(b.binSkuQty AS DECIMAL(18, 2)))) > 0.0001
|
||||||
ORDER BY b.wmsCoId, b.binType, b.binName, b.skuId`;
|
ORDER BY b.wmsCoId, b.binType, b.binName, b.skuId`;
|
||||||
|
|
||||||
const rows = await cloudDb.query(
|
// 该查询 union 了 4 个销量来源(含 qmcust 全渠道扫描),全仓窗口可能超过默认 60s;
|
||||||
|
// mssql 12.x 请求级 timeout 不生效,必须走池级放宽的慢查询入口。
|
||||||
|
const runQuery = typeof cloudDb.querySlow === 'function' ? cloudDb.querySlow : cloudDb.query;
|
||||||
|
const rows = await runQuery(
|
||||||
sqlText,
|
sqlText,
|
||||||
{
|
{
|
||||||
...binIn.params,
|
...binIn.params,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user