JPA 并发查询同一条数据时的效率问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
joooooker21
V2EX    Java

JPA 并发查询同一条数据时的效率问题

  •  
  •   joooooker21 Feb 25, 2022 2519 views
    This topic created in 1521 days ago, the information mentioned may be changed or developed.

    伪代码

     public RespData findOrderTest(@RequestParam String orderCode,@RequestParam String strategy) { TbOrder tbOrder = orderDao.findByOrderCodeAndStrategy(orderCode, strategy); //do something try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return RespData.success(tbOrder); } 

    使用 jmeter 并发调用,查询条件不变,反复查询同一条数据,发现查询速率变慢

    正常耗时日志

     `---[5054.53776ms] cn.*.PatientAppController:findOrderTest() +---[54.165884ms] cn.*.TbOrderDao:findByOrderCodeAndStrategy() #349 +---[0.079756ms] javax.persistence.EntityManager:clear() #350 `---[0.018264ms] cn.*.RespData:buildSuccess() #363 

    测试期间接口耗时逐渐增加,异常耗时日志

     `---[29406.81247ms] cn.*.PatientAppController:findOrderTest() +---[24406.507885ms] cn.*.TbOrderDao:findByOrderCodeAndStrategy() #349 +---[0.036484ms] javax.persistence.EntityManager:clear() #350 `---[0.020533ms] cn.*.RespData:buildSuccess() #363 

    已排除是数据库性能问题,怀疑是 jpa 内部的实现机制所致,多番测试还是没有找到问题,分享出来给大家看看,请大佬指教

    10 replies    2022-02-26 08:46:13 +08:00
    zhady009
        1
    zhady009  
       Feb 25, 2022
    mark 下 mongodb 好像也有这种情况

    控制台里查一样的语句很快就返回

    race 的时候发现也是慢在 repository 的方法里 用了 10 秒 而且就 4000 条数据

    版本是 2.4 的
    joooooker21
        2
    joooooker21  
    OP
       Feb 25, 2022
    查询后直接返回,速度是不会变慢的。怀疑是 jpa 内部有某种锁的机制
    wolfie
        3
    wolfie  
       Feb 25, 2022
    看看有没有缓存开关
    mango88
        4
    mango88  
       Feb 25, 2022
    压测多久发生一次 ? 变慢时,jvm 是否在 GC ?
    siweipancc
        5
    siweipancc  
       Feb 25, 2022 via iPhone
    orz 你开个纯接口,里边也睡一会,并发下还是会重现的
    joooooker21
        7
    joooooker21  
    OP
       Feb 25, 2022
    @wolfie 尝试过 EntityManager.clear() 情况还是一样

    @mango88 基本上持续几秒就开始出现这样的情况,排除是 GC

    @siweipancc 尝试过,还是会重现
    1194129822
        8
    1194129822  
       Feb 25, 2022   1
    这不是 JPA 的问题,你换成 Mybatis 之类也会出现同样的情况。很明显是连接池的问题,Connection 一般都是有限的,你并发高,把 Connection 占完了,而且迟迟不释放。后面线程阻塞在获取 Connection ,你可以看一下你用的是什么 DataSource ,Hikari 默认只有 10 个连接。你把连接数调到几百试一下,你这就相当于慢查询,造成的雪崩效应。但是真实环境下 Connection 也不能太多,不然雪崩的就是数据库了,JDBC 的阻塞性其实保护的是数据库。
    joooooker21
        9
    joooooker21  
    OP
       Feb 26, 2022
    @1194129822 多谢分享。我有个疑问,数据库的 Connection 难道不是在返回查询结果后就立即释放了?另外这段代码是也并没有开启事务
    zhenjiachen
        10
    zhenjiachen  
       Feb 26, 2022 via iPhone
    我觉得 8 楼说的对,你可以看一下你的连接池支不支持指标,看一下指标就可以看出是不是并发后把链接用完了导致其他请求等待获取连接。
    About     Help     Advertise     Blog     API     FAQ     Solana     6075 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 548ms UTC 02:31 PVG 10:31 LAX 19:31 JFK 22:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86