请教一个 SpringJPA+Hibernate+QueryDSL 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DreamSaddle
V2EX    Java

请教一个 SpringJPA+Hibernate+QueryDSL 的问题

  •  
  •   DreamSaddle 2023-11-03 11:30:48 +08:00 1544 次点击
    这是一个创建于 713 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目有 1200 张表,对应 1200 个实体,项目每次启动的时候会对每个实体进行初始化处理,导致启动很慢;

    尝试过使用懒加载的处理方式,但是没有生效,因为项目还用了 redis 。

    想请教一下大佬们有啥优化方法吗?

    9 条回复    2023-11-04 09:01:59 +08:00
    DreamSaddle
        1
    DreamSaddle  
    OP
       2023-11-03 11:34:36 +08:00
    项目启动后,日志里很多 tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation ,一直在执行这边的。
    sky857412
        2
    sky857412  
       2023-11-03 11:37:14 +08:00
    应该是 hibernate 的 ddl-auto 的原因吧,没有改实体的时候,启动时可以改成 none
    DreamSaddle
        3
    DreamSaddle  
    OP
       2023-11-03 13:36:00 +08:00
    @sky857412 #2 我调试过,启动的时候应该是会为每个实体的 Repository 生成代理,就是这个过程比较慢,加上项目里实体过多。
    zhenjiachen
        4
    zhenjiachen  
       2023-11-03 14:16:25 +08:00 via iPhone
    在 Repository 上面加 lazy 注解呢?
    DreamSaddle
        5
    DreamSaddle  
    OP
       2023-11-03 14:48:05 +08:00
    @zhenjiachen #4 我有一千多个 Repository 接口呀,肯定不能每个都去加吧。
    如果是使用配置来统一实现懒加载,我尝试过,但是没有成功。
    我看过说是这个懒加载只支持存在一个数据源的情况下生效,我项目里有用 redis ,好像就是因为这样造成的懒加载不生效的。
    DreamSaddle
        6
    DreamSaddle  
    OP
       2023-11-03 14:52:59 +08:00
    项目启动的时候,相当于每一个 Repository 接口都会走一遍 RepositoryFactoryBeanSupport#afterPropertiesSet() 方法,就是在这个方法最后面判断了 LazyInit ,但是一直不生效。
    zhenjiachen
        7
    zhenjiachen  
       2023-11-03 16:44:59 +08:00 via iPhone
    我想了一下可以有两种办法可以简单实现,1.因为每个 repository 加要加 @Repository 注解,你可以自定义注解同时做到 repository 注解和懒加载。2.可以看看有没有 lazy 接口可以实现,自己在接口使用 default 实现 lazy 接口,然后所有的 repository 接口都基础这个实现了 lazy 接口的 repository 。应该算是相对快速的了。
    DreamSaddle
        8
    DreamSaddle  
    OP
       2023-11-03 17:54:18 +08:00
    @zhenjiachen #7 我尝试过在 EnableJpaRepositories 注解添加 bootstrapMode = BootstrapMode.DEFERRED ,添加后在 RepositoryFactoryBeanSupport 类中能发现识别到了需要 lazyInit ,但是在实际启动过程中,就是在初始化 Repository Bean 实例时还是每次都调用了 RepositoryFactoryBeanSupport#getObject() 方法,实际上就没有实现 lazyInit 的效果了。
    zhenjiachen
        9
    zhenjiachen  
       2023-11-04 09:01:59 +08:00
    BootstrapMode.LAZY 也不行吗。BootstrapMode.DEFERRED 只是创建 context 的不初始化,等 context 初始化完了然后就会创建 bean
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5508 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:34 PVG 14:34 LAX 23:34 JFK 02:34
    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