V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
reid2017
V2EX  ›  Java

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

  •  
  •   reid2017 · 2018-03-01 17:04:06 +08:00 · 6150 次点击
    这是一个创建于 2441 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    感激涕零...

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

    另外,AbstractRoutingDataSource 了解一下
    reid2017
        23
    reid2017  
    OP
       2018-03-02 09:47:46 +08:00
    @zhouyou457 用的就是 AbstractRoutingDataSource,不知道是否用得不对
    wmhack
        24
    wmhack  
       2018-03-02 11:20:01 +08:00 via iPhone
    @letitbesqzr 好吧,我只是说说自己的观点。
    reid2017
        25
    reid2017  
    OP
       2018-03-02 11:30:38 +08:00
    @tonyli 还是不行,你的使用了 MyBatis,把 routingDataSource 注入到 SqlSessionFactory,我没有使用 MyBatis,只用 sping-data-jpa
    zhouyou457
        26
    zhouyou457  
       2018-03-02 11:57:04 +08:00
    try {
    String datasourceName = getAnnotationDatasource(proceedingJoinPoint);
    if (datasourceName != null) {
    DataSourceContextHolder.setDataSourceType(datasourceName);
    }
    return proceedingJoinPoint.proceed();
    } finally {
    DataSourceContextHolder.clearDataSourceType();
    }

    大致就是这样...
    getAnnotationDatasource 是用切片配合注解获取需要切换到的数据源
    reid2017
        27
    reid2017  
    OP
       2018-03-02 16:59:47 +08:00
    @zhouyou457 大致是这样写的,都不行。每次都路由到我配置的 slave 数据源,而不是 master 数据源
    tonyli
        28
    tonyli  
       2018-03-03 00:52:16 +08:00 via iPhone
    @reid2017 我二者结合了,就用 jpa 也是可以的呀
    tonyli
        29
    tonyli  
       2018-03-03 00:55:11 +08:00 via iPhone
    @reid2017 众口难调,我写的 demo 直接结合二者,想用哪个都可以😄
    ourslay
        30
    ourslay  
       2018-03-03 22:44:35 +08:00
    chinadeng
        31
    chinadeng  
       2018-03-04 22:05:20 +08:00
    @letitbesqzr 用 querydsl,你们大概多少张表关联查询?
    reid2017
        32
    reid2017  
    OP
       2018-03-05 17:09:17 +08:00
    @tonyli 你是把 routingDataSource 注入到了 mybatis 的 sqlSessionFactory 里了,你如果不用 mybatis,是把它注入到哪里? JPA 的 EntityManager 吗?这样问题又来了,有两个 dataSource,就需要两个 EntityManager,那 routing 应该注入到哪一个?
    reid2017
        33
    reid2017  
    OP
       2018-03-06 15:07:44 +08:00
    @tonyli 用 mybatis 轻松实现两个数据源动态切换读写分离,用 jpa 就还是没头绪。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3347 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:00 · PVG 19:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.