有熟悉 spring-data-jpa 的大牛吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
reid2017
V2EX    Java

有熟悉 spring-data-jpa 的大牛吗?

  •  
  •   reid2017 2018 年 3 月 1 日 6906 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    spring-data-jpa,如何实现多数据源动态切换实现读写分离,网上的教程都看遍了,都不行,debug 跟踪了三天都没找到在哪里切换数据源。

    有没有大牛可以分享下实现代码?

    感激涕零...

    第 1 条附言    2018 年 3 月 6 日
    终于成功了,使用 JPA / MyBatis 实现简单多数据源动态切换和读写分离,附上完整代码:
    https://github.com/linyongfu2013/springboot-multi-datasource.git
    33 条回复    2018-03-06 15:07:44 +08:00
    tonyli
        1
    tonyli  
       2018 年 3 月 1 日
    小弟,不才之前,也被困惑许久,我自己有总结出一个可行方式。
    https://github.com/Linda-Tan/spring-boot/blob/master/src/main/java/com/junliang/spring/config/JpaConfig.java
    beginor
        2
    beginor  
       2018 年 3 月 1 日 via Android
    读写分离难道不应该在数据库层面做么?
    CoderGeek
        3
    CoderGeek  
       2018 年 3 月 1 日
    首先读写分离最好用数据层面 可以看看 三方一类提供的 读写分离 mysql 介绍
    还有如果是单纯的切换数据源 用 springboot 尝试过 网上有很多例子
    CoderGeek
        4
    CoderGeek  
       2018 年 3 月 1 日
    数据库层面
    wmhack
        5
    wmhack  
       2018 年 3 月 1 日 via iPhone
    jpa,后期维护,你会想哭
    tonyli
        6
    tonyli  
       2018 年 3 月 1 日
    @CoderGeek 你自己测试一下看看有一个能用的?
    tonyli
        7
    tonyli  
       2018 年 3 月 1 日
    @wmhack 没哭呀。
    tonyli
        8
    tonyli  
       2018 年 3 月 1 日
    有人知道怎么删除评论吗
    EmdeBoas
        9
    EmdeBoas  
       2018 年 3 月 1 日
    @tonyli V 站对自己言论负责,发了就不能删
    reid2017
        10
    reid2017  
    OP
       2018 年 3 月 1 日
    @CoderGeek
    @beginor
    想尝试自己用代码实现,一般的数据库中间件应该都是用代码实现的
    unlimitedsola
        11
    unlimitedsola  
       2018 年 3 月 1 日
    @reid2017 数据库也是用代码实现的,不如你尝试自己用代码实现一个吧
    reid2017
        12
    reid2017  
    OP
       2018 年 3 月 1 日
    @tonyli 看了你的代码,有点茅塞顿开的感觉,你的 JpaConfig 里注入了 routingDataSource,我是对应两个 dataSource ( write / read ) 分别写了两个 JpaConfig,分别注入两个 dataSource,明天试下你的方式看下行不行。
    letitbesqzr
        13
    letitbesqzr  
       2018 年 3 月 1 日
    @wmhack #5 面对企业级应用动则上千张表,不用 jpa 你会想哭。
    wojfsdj
        14
    wojfsdj  
       2018 年 3 月 1 日
    @letitbesqzr 请教一下,用 spring data jpa 复杂的关联关系查找你们是用什么方式做的呢? 写 HQL 还是用 Criterion 之类呢?
    letitbesqzr
        15
    letitbesqzr  
       2018 年 3 月 1 日   2
    @wojfsdj #14 很少去写 hql,Criteria 用的比较多,然后就是 querydsl 了,报表之类的几乎都是 querydsl 来做,很少遇见写不出来的函数。调点数据库的聚合函数也轻轻松松。
    wojfsdj
        16
    wojfsdj  
       2018 年 3 月 1 日
    @letitbesqzr 非常感谢,querydsl 了解得比较少。最近做报表之类的,每个查询都要关联几个表,过滤条件也不少,让人比较头疼。 而且查询出来的数据字段又不同,不同的表不同的字段,也不知道是封装成对象好还是自己用 Map 组装再给前端比较好
    tonyli
        17
    tonyli  
       2018 年 3 月 1 日 via iPhone
    @reid2017 Ok 的
    wmhack
        18
    wmhack  
       2018 年 3 月 2 日 via iPhone
    @letitbesqzr jpa 代码侵入了,没有 mybatis 直接写 sql 看着直观,jpa 调试时,日志打印也看不到执行的 sql 语句
    ghos
        19
    ghos  
       2018 年 3 月 2 日 via Android
    每次看到 jpa 的帖子 总是有人说好有人说不好 争了几年也没有争出所以然来。。。。
    letitbesqzr
        20
    letitbesqzr  
       2018 年 3 月 2 日
    @wmhack 只能说你不会用,看不到 sql 执行, 你当大家都是傻的? 让连接池输出执行的 sql 和参数不行?
    aias
        21
    aias  
       2018 年 3 月 2 日 via iPhone
    @wmhack 可以看到。但是在这里 jpa 调优会很恶心
    zhouyou457
        22
    zhouyou457  
       2018 年 3 月 2 日   1
    jpa 和 mybatis 的问题业界都吵了多久了....哪个用着顺手就行了嘛..

    另外,AbstractRoutingDataSource 了解一下
    reid2017
        23
    reid2017  
    OP
       2018 年 3 月 2 日
    @zhouyou457 用的就是 AbstractRoutingDataSource,不知道是否用得不对
    wmhack
        24
    wmhack  
       2018 年 3 月 2 日 via iPhone
    @letitbesqzr 好吧,我只是说说自己的观点。
    reid2017
        25
    reid2017  
    OP
       2018 年 3 月 2 日
    @tonyli 还是不行,你的使用了 MyBatis,把 routingDataSource 注入到 SqlSessionFactory,我没有使用 MyBatis,只用 sping-data-jpa
    zhouyou457
        26
    zhouyou457  
       2018 年 3 月 2 日
    try {
    String datasourceName = getAnnotationDatasource(proceedingJoinPoint);
    if (datasourceName != null) {
    DataSourceContextHolder.setDataSourceType(datasourceName);
    }
    return proceedingJoinPoint.proceed();
    } finally {
    DataSourceContextHolder.clearDataSourceType();
    }

    大致就是这样...
    getAnnotationDatasource 是用切片配合注解获取需要切换到的数据源
    reid2017
        27
    reid2017  
    OP
       2018 年 3 月 2 日
    @zhouyou457 大致是这样写的,都不行。每次都路由到我配置的 slave 数据源,而不是 master 数据源
    tonyli
        28
    tonyli  
       2018 年 3 月 3 日 via iPhone
    @reid2017 我二者结合了,就用 jpa 也是可以的呀
    tonyli
        29
    tonyli  
       2018 年 3 月 3 日 via iPhone
    @reid2017 众口难调,我写的 demo 直接结合二者,想用哪个都可以
    ourslay
        30
    ourslay  
       2018 年 3 月 3 日
    chinadeng
        31
    chinadeng  
       2018 年 3 月 4 日
    @letitbesqzr 用 querydsl,你们大概多少张表关联查询?
    reid2017
        32
    reid2017  
    OP
       2018 年 3 月 5 日
    @tonyli 你是把 routingDataSource 注入到了 mybatis 的 sqlSessionFactory 里了,你如果不用 mybatis,是把它注入到哪里? JPA 的 EntityManager 吗?这样问题又来了,有两个 dataSource,就需要两个 EntityManager,那 routing 应该注入到哪一个?
    reid2017
        33
    reid2017  
    OP
       2018 年 3 月 6 日
    @tonyli 用 mybatis 轻松实现两个数据源动态切换读写分离,用 jpa 就还是没头绪。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2257 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:26 PVG 09:26 LAX 17:26 JFK 20:26
    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