APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

[Bug] inner join关联查询出现副表查询数量超限的问题

Open Michaelove opened this issue 1 year ago • 8 comments

APIJSON测试 api_json_get 2024-10-08 14_22_32.txt

Michaelove avatar Oct 09 '24 08:10 Michaelove

看起来是 JOIN 缓存未正确读取到导致重复执行 SQL,升级到 7.0.3 再试试

TommyLemon avatar Oct 09 '24 15:10 TommyLemon

使用的6.3.0版本,暂时无法升级版本,有其他方案解决吗(除了加大执行SQL数量限制,指标不治本),我改了一部分代码,驼峰转换,如下: image

gxmanito avatar Nov 06 '24 09:11 gxmanito

https://github.com/Tencent/APIJSON/issues/615#issuecomment-2265718955 这里处理后会有个n+1的问题,这里item里面还是驼峰的,但是on.getTargetKey()已经是蛇形了,所以不会走下面childMap.put(viceSql, curItem)缓存 image

image

目前想到的解决方案是改源码,item转为蛇形,不知道是否有其他方案

gxmanito avatar Nov 06 '24 12:11 gxmanito

又出现了另一个问题,我的查询需要控制数据权限,所以在verifyAccess将stationCode条件加进去,在join也加进去,但是副表的缓存还是不走,导致n+1查询 image image

打断点是因为这里的SQL where条件顺序乱了 image

gxmanito avatar Nov 07 '24 11:11 gxmanito

#615 (comment) 这里处理后会有个n+1的问题,这里item里面还是驼峰的,但是on.getTargetKey()已经是蛇形了,所以不会走下面childMap.put(viceSql, curItem)缓存 image

image

目前想到的解决方案是改源码,item转为蛇形,不知道是否有其他方案

需要改源码处理下,判断 JSONResponse.IS_FORMAT_HYPHEN https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONResponse.java#L25-L34

TommyLemon avatar Nov 07 '24 15:11 TommyLemon

@gxmanito 统一在 DemoObjectParser 重写 newSQLConfig 并 putWhere 试试

TommyLemon avatar Nov 07 '24 15:11 TommyLemon

https://github.com/Tencent/APIJSON/issues/769#issuecomment-2462514023 在 DemoObjectParser 重写 newSQLConfig 并 putWhere还是不走缓存的,看断点是因为putWhere主表后就会到execute的viceConfig.putWhere(这时候join的where条件只是主表的),然后才是newSQLConfig的putWhere子表的条件(我权限赋值的) image image

当我加上join的putWhere时,又会导致顺序错乱,缓存还是读不到 image image

gxmanito avatar Nov 08 '24 06:11 gxmanito

@gxmanito 试试 AbstractSQLConfig.getWhere 中判断不包含这个键值对则统一 put

TommyLemon avatar Nov 08 '24 15:11 TommyLemon